This is the complete code:
$p1 = [System.Diagnostics.Process]::Start("Powershell.exe", ".\Desktop\script1.ps1")
$p2 = [System.Diagnostics.Process]::Start("Powershell.exe", ".\Desktop\script2.ps1")
$p3 = [System.Diagnostics.Process]::Start("Powershell.exe", ".\Desktop\script3.ps1")
$procList = @{}
$procList.Add("process1", $p1)
$procList.Add("process2", $p2)
$procList.Add("process3", $p3)
$skipCheckProc = @()
while(($p1.HasExited -and $p2.HasExited -and $p3.HasExited) -eq $false)
{
Echo "Sleep 2 seconds..."
Start-Sleep -Seconds 2
foreach ($pName in $procList.Keys)
{
if ($skipCheckProc -contains $pName)
{
continue;
}
$proc = $procList.$pName
if ($proc.HasExited -eq $true)
{
Echo ("$pName exited with code " + $proc.ExitCode)
$skipCheckProc += $pName # no need check this process once it exits.
}
else
{
Echo ("$pName still running...")
}
}
}
Echo "All done."
foreach ($pName in $procList.Keys)
{
Echo ("$pName exit code is [{0}]" -f $procList.$pName.ExitCode)
}
script1
start-sleep -seconds 5
throw;
trap
{
# Powershell.exe can return the right code only in trap.
[System.Environment]::Exit(-5)
}
# Success
[System.Environment]::Exit(0)
script2
start-sleep -seconds 8
throw;
trap
{
# Powershell.exe can return the right code only in trap.
[System.Environment]::Exit(-8)
}
# Success
[System.Environment]::Exit(0)
script3
start-sleep -seconds 3
throw;
trap
{
# Powershell.exe can return the right code only in trap.
[System.Environment]::Exit(-3)
}
# Success
[System.Environment]::Exit(0)
(The end)