我有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
谢谢,
诺姆
答案 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_Jobs
,Get-Help about_Job_Details
以及各个命令的Get-Help
条目中了解详情。