同步从其他PowerShell运行powershell脚本

时间:2017-11-09 12:54:45

标签: .net powershell asynchronous

我有2个powershell脚本(A.ps1和B.ps1)。

我想从脚本A.ps1调用脚本B.ps1,但是在调用B.ps1之后让A.ps1继续执行它而不是等待B.ps1完成它的执行(即运行B.ps1 in一种异步的方式)。

如何实现? 我试过了:

PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& 'C:\scripts\B.ps1'" 

但这导致脚本A等到脚本B完成。

我也尝试过:

Start-Process 'C:\scripts\B.ps1'

但由于某种原因,这个cmdlet根本不能在我的机器上运行(它实际上打开了“你想如何打开这个文件?”窗口,无论我选择它只是继续显示这个窗口)< / p>

我正在使用PowerShell版本5.1

谢谢,

诺姆

2 个答案:

答案 0 :(得分:1)

这些是脚本示例:

我设置了睡眠定时器,告诉您即使 B.ps1 启动记事本并等待5秒后, A.ps1 仍然继续显示第二个定时器秒并且不等待 B.ps1 完成。

A.ps1:(秒显示计时器,直到10秒)

1..10 | ForEach-Object {
    Start-Sleep -Seconds 1
    Write-Host $_
    if($_ -eq 3){
        Start-Job -FilePath .\B.ps1
    }
}

B.ps1:(启动记事本)

Start-Process notepad
Start-Sleep -Seconds 5

请参阅this link中的示例4。

答案 1 :(得分:0)

在你的剧本开头:

$Job = Start-Job -FilePath 'C:\Path\To\Script.ps1';
#Script continues here

然后,如果脚本有输出,则在脚本结束时:

$Output = Wait-Job $Job | Receive-Job;
Remove-Job $Job;
# Do whatever with $Output

如果脚本没有输出:

Wait-Job $Job | Remove-Job;

显然,这里根本没有错误检查或纠正。作业可能处于失败状态或返回错误,理想情况下您需要处理它。您可以在Get-Help about_JobsGet-Help about_Job_Details以及各个命令的Get-Help条目中了解详情。