Принудительная немедленная оценка в сценарии powershell (копировать переменную по значению, а не по ссылке)

У меня проблема со следующим кодом

foreach ($ex in ("foo", "bar", "baz")) {
$timer = New-Object Timers.timer
$taction =  {
    Write-Host "Timer fired for: $ex"
}
$timer.Interval = 1000 
$timer.AutoReset = $false
$timer.Start()

Register-ObjectEvent -InputObject $timer -EventName elapsed -SourceIdentifier "$ex" -Action $taction

}

Этот код дает следующий вывод

Timer fired for: baz
Timer fired for: baz
Timer fired for: baz

Но я бы хотел, чтобы это было foo, bar и baz. Проблема, по-видимому, в том, что переменная $ex в конце считывается всеми таймерами, поэтому какое бы значение она ни имела, все они ее получают. Как скопировать значение $ex в действие $, чтобы оно было уникальным?


person Teletha    schedule 19.06.2012    source источник


Ответы (1)


Попробуйте использовать [scriptblock]::Create(), это оценивает аргументы при создании:

foreach ($ex in ("foo", "bar", "baz"))
{

$timer = New-Object Timers.timer
$taction =  [scriptblock]::create("Write-Host Timer fired for: $ex")

$timer.Interval = 1000 
$timer.AutoReset = $false
$timer.Start()

Register-ObjectEvent -InputObject $timer -EventName elapsed -SourceIdentifier $ex  -Action $taction
}
person CB.    schedule 20.06.2012