A resposta de Steve Townsend está correta na teoria, mas não na prática, como apontou @likwid. Meu código revisado leva em consideração a barreira do contexto do trabalho - nada ultrapassa essa barreira por padrão! A $_
variável automática pode, portanto, ser usada no loop, mas não pode ser usada diretamente no bloco de scripts, pois está dentro de um contexto separado criado pelo trabalho.
Para passar variáveis do contexto pai para o contexto filho, use o -ArgumentList
parâmetro on Start-Job
para enviá-lo e use param
dentro do bloco de scripts para recebê-lo.
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 *
(Geralmente, gosto de fornecer uma referência à documentação do PowerShell como evidência de suporte, mas, infelizmente, minha pesquisa foi infrutífera. Se você souber onde a separação de contexto está documentada, poste um comentário aqui para que eu saiba!)
receive-job (wait-job ($a = start-job { "heyo!" })); remove-job $a
ou$a = start-job { "heyo!" }; wait-job $a; receive-job $a; remove-job $a
Observe também que, se você ligarreceive-job
antes do término do trabalho, poderá obter nada.