PowerShell 更改 ScriptBlock 中的变量

yog*_*ute 3 powershell xaml

我正在尝试更改 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}
Run Code Online (Sandbox Code Playgroud)

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

Mat*_*sen 6

当您$count在 ScriptBlock 范围内进行修改时,将创建本地副本,并且$Count父范围中的原始变量保持不变。

有几种方法可以$count在父作用域中进行修改,可以使用显式作用域限定符:

$updateBlock = { Write-Host $count; $script:count++; Write-Host $count}
Run Code Online (Sandbox Code Playgroud)

或者通过使用Get-Variable相对-Scope参数检索变量(-Scope 1指直接父作用域):

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

或者(如@PetSerAl指出的),使用[ref]关键字:

 $updateBlock = { Write-Host $count; ([ref]$count).Value++; Write-Host $count}
Run Code Online (Sandbox Code Playgroud)