我在编写调用另外两个PowerShell函数的脚本(在不同的窗口中)时遇到困难,然后在继续之前等待它们终止。
我开始使用下面的(示例命令),命令将花费一个小时左右来完成:
invoke-expression 'cmd /c start powershell -Command {GetSeriesDate -- '2016-01-01'}'
但是这似乎不等待新窗口在继续之前终止。
我也调查了start-job
和wait-job
,但找不到让它工作的方法,特别是在并行创建两个作业并等待两者完成时。
有人有任何建议吗?
更新:感谢Bassie,我可以使用以下内容:
Start-Process -FilePath "cmd.exe" -ArgumentList "/c start powershell -Command {GetSeriesDate -- '2016-01-01'}"
Start-Process -FilePath "cmd.exe" -ArgumentList "/c start powershell -Command {GetSeriesDate -- '2016-01-02'}" -Wait
但是当它同时运行时它只等待后者,并且向第一个命令添加一个等待选项将导致它们顺序运行...无论如何要使wait函数将这两个命令包含为AND而不是OR?
答案 0 :(得分:1)
您可以使用Start-Process
:
Start-Process -FilePath "cmd.exe" -ArgumentList "/c timeout 5" -Wait
Start-Process -FilePath "cmd.exe" -ArgumentList "/c timeout 5"
Start-Process -FilePath "cmd.exe" -ArgumentList "/c timeout 5"
这里我们在Start-Process
上调用cmd
,然后在该窗口运行我们想要的任何命令(在这种情况下,我只是用timeout
睡了5秒钟来说明{{ 1}}开关)。
第二行直到5秒后才会执行,但第三行不会等待(第二行调用完成后它将立即运行)。
所以在你的情况下你可以尝试:
-Wait
<强>更新强>
如果您需要同时运行这两个命令,并等待两者同时完成,您可以将其与Start-Process -FilePath "cmd.exe" -ArgumentList "/c start powershell -Command {GetSeriesDate -- '2016-01-01'}" -Wait
Start-Process -FilePath "cmd.exe" -ArgumentList "/c Whatever you need to do next"
结合使用:
Start-Job
上述内容将等到两个作业完成后再向主机写入$job1 = {Start-Process -FilePath "cmd.exe" -ArgumentList "/c start powershell -Command {GetSeriesDate -- '2016-01-01'}" -Wait}
$job2 = {Start-Process -FilePath "cmd.exe" -ArgumentList "/c Whatever you need to do next"}
Start-Jon -ScriptBlock $job1
Start-Jon -ScriptBlock $job2
Get-Job | Wait-Job | Out-Null
Write-Host "HELLO"
。
答案 1 :(得分:1)
如果你想同时运行它们同时等待完成,你最好的选择是在脚本块中用-wait param包装启动进程,然后将其作为一个作业启动,然后执行get-job |等待工作接收作业以收集数据(如果您愿意,也可以使用while循环进行等待)
脚本看起来如下 -
$SB1 = {
Start-Process -FilePath "cmd.exe" -ArgumentList "/c timeout 5" -Wait
}
$SB2 = {
Start-Process -FilePath "powershell.exe" -ArgumentList "/c timeout 5" -Wait
}
Start-Job -ScriptBlock $SB1
Start-Job -ScriptBlock $SB2
get-job | wait-job | receive-job