ответ от Стива Townsend правильно в теории, но не на практике, @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 в качестве подтверждающих доказательств, но, увы, мои поиски были безрезультатными. Если вы не знаете, где разделение контекста документирована, оставить комментарий здесь, чтобы сообщить мне знаю!)
** ТЛ; др: ** 'приемно-задание (ожидание-работа ($ а = запуск задания {«Heyo ! "})); remove-job $ a' или '$ a = start-job {" heyo!"}; wait-job $ a; receive-job $ a; remove-job $ a' Обратите внимание, что если вы вызываете' get-job' до завершения задания, вы можете ничего не получить. – Andrew
Также '(get -job $ a) .jobstateinfo.state; ' – Andrew