Переменная изменения PowerShell в ScriptBlock

xaml powershell

400 просмотра

1 ответ

Я пытаюсь изменить переменную внутри 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. Итак, как мне получить доступ к переменной, а не только к ее копии?

Автор: yogurtflute Источник Размещён: 08.11.2019 11:18

Ответы (1)


4 плюса

Решение

Когда вы изменяете $countвнутри области ScriptBlock, создается локальная копия, а исходная $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}

Или (как указано @PetSerAl ) используйте [ref]ключевое слово:

 $updateBlock = { Write-Host $count; ([ref]$count).Value++; Write-Host $count}
Автор: Mathias R. Jessen Размещён: 20.08.2016 02:06
Вопросы из категории :
32x32