Відповідь Стіва Таунсенда є теоретичною, але не на практиці, як вказував @likwid. У моєму переглянутому коді враховано бар'єр-контекст завдання - ніщо не переступає цей бар'єр за замовчуванням! Таким чином, автоматична $_
змінна може бути використана в циклі, але не може бути використана безпосередньо в блоці сценарію, оскільки вона знаходиться в окремому контексті, створеному завданням.
Щоб передати змінні з батьківського контексту до дочірнього контексту, використовуйте -ArgumentList
параметр on, 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 як підтвердження, але, на жаль, мій пошук виявився безрезультатним. Якщо вам трапляється знати, де документоване розділення контексту, опублікуйте тут коментар, щоб повідомити мені!)
receive-job (wait-job ($a = start-job { "heyo!" })); remove-job $a
або$a = start-job { "heyo!" }; wait-job $a; receive-job $a; remove-job $a
Зауважте також, що якщо ви зателефонуєтеreceive-job
до того, як робота закінчиться, ви можете взагалі нічого не отримати.