La respuesta de Steve Townsend es correcto en teoría, pero no en la práctica como @likwid señaló. Mi código revisado tiene en cuenta barrera de contexto de trabajo - ¡nada cruza esa barrera de forma predeterminada! La variable automática $_
se puede utilizar en el ciclo, pero no se puede usar directamente dentro del bloque de secuencia de comandos porque está dentro de un contexto separado creado por el trabajo.
para pasar variables del contexto padre al contexto de la niñez, utilice el parámetro -ArgumentList
en Start-Job
para enviar y utilizar param
dentro del bloque de script para recibirlo.
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 *
(que en general, como para proporcionar una referencia a la documentación PowerShell como elementos de prueba pero, por desgracia, mi búsqueda ha sido infructuosa. Si por casualidad usted conoce donde se documenta la separación contexto, publicar un comentario aquí que me deje saben!)
** tl; dr: ** 'Receive-Job (esperar puesto de trabajo ($ a = Start-Job { "heyo ! "})); remove-job $ a' o '$ a = start-job {" heyo!"}; wait-job $ a; receive-job $ a; remove-job $ a' Tenga en cuenta también que si llama a' receive-job' antes de que el trabajo finalice, es posible que no obtenga nada en absoluto. – Andrew
También '(get -job $ a) .jobstateinfo.state; ' – Andrew