我试图更改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的重复序列。那么如何访问变量而不仅仅是它的副本?
答案 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}