我正在尝试更改 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 的重复序列。那么如何访问该变量而不仅仅是它的副本呢?
当您$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)
| 归档时间: |
|
| 查看次数: |
1242 次 |
| 最近记录: |