PowerShell在ScriptBlock中更改变量

时间:2016-08-20 12:20:13

标签: xaml powershell

我试图更改ScriptBlock中的变量。 我做错了什么?

$reader=(New-Object System.Xml.XmlNodeReader $xaml)
$Window=[Windows.Markup.XamlReader]::Load($reader)
$Window.Add_SourceInitialized( {
    $timer = new-object System.Windows.Threading.DispatcherTimer
    $timer.Interval = [TimeSpan]"0:0:0.25"
    $timer.Add_Tick( $updateBlock )
    $timer.Start()
 } )
 $count = 0
 $updateBlock = { Write-Host $count; $count++; Write-Host $count}

输出是0和1的重复序列。那么如何访问变量而不仅仅是它的副本?

1 个答案:

答案 0 :(得分:3)

在ScriptBlock范围内修改$count时,会创建一个本地副本,并保持父范围中的原始$Count变量不受影响。

有几种方法可以修改父作用域中的$count,或者使用显式范围限定符:

$updateBlock = { Write-Host $count; $script:count++; Write-Host $count}

或者通过使用Get-Variable检索变量并且相对-Scope参数(-Scope 1引用直接父范围):

$updateBlock = { Write-Host $count; (Get-Variable -Scope 1 -Name count).Value++; Write-Host $count}

或(作为pointed out by @PetSerAl),使用[ref]关键字:

 $updateBlock = { Write-Host $count; ([ref]$count).Value++; Write-Host $count}