Once a job starts you have no control over the order in which the results will be returned. Also, if you're going to parameterize values in the scriptblock you have to pass the parameter value using the -ArgumentList parameter, or (more conveniently) the "$Using:" notation.
Here's a simple example:
'Colin', 'Joe' |
ForEach-Object {
$name = $_
Start-Job -ScriptBlock { "Hello, $Using:name" } | Out-Null
}
While ($jobs = Get-Job) {
foreach ($job in $jobs) {
if ($job.State -eq 'Completed') {
Receive-Job -Id $job.Id
Remove-Job -Id $job.Id
}
}
}