Ответ от Стива Таунсенда верен в теории, но не на практике, как указал @likwid. Мой пересмотренный код учитывает барьер контекста задания - по умолчанию ничто не пересекает этот барьер! Таким образом, автоматическая переменная $_
может использоваться в цикле, но не может использоваться непосредственно в блоке сценария, поскольку она находится в отдельном контексте, созданном заданием.
Чтобы передать переменные из родительского контекста в дочерний контекст, используйте параметр -ArgumentList
в Start-Job
, чтобы отправить его, и используйте param
внутри блока скрипта, чтобы получить его.
cls
# Send in two root directory names, one that exists and one that does not.
# Should then get a "True" and a "False" result out the end.
"temp", "foo" | %{
$ScriptBlock = {
# accept the loop variable across the job-context barrier
param($name)
# Show the loop variable has made it through!
Write-Host "[processing '$name' inside the job]"
# Execute a command
Test-Path "\$name"
# Just wait for a bit...
Start-Sleep 5
}
# Show the loop variable here is correct
Write-Host "processing $_..."
# pass the loop variable across the job-context barrier
Start-Job $ScriptBlock -ArgumentList $_
}
# Wait for all to complete
While (Get-Job -State "Running") { Start-Sleep 2 }
# Display output from all jobs
Get-Job | Receive-Job
# Cleanup
Remove-Job *
(Я обычно хотел бы предоставить ссылку на документацию PowerShell в качестве подтверждающего доказательства, но, увы, мой поиск оказался бесплодным. Если вам случится узнать, где задокументировано разделение контекста, оставьте здесь комментарий, чтобы сообщить мне!) 1014 *