调用两个新实例并等待返回

时间:2016-11-02 14:04:55

标签: powershell

我在编写调用另外两个PowerShell函数的脚本(在不同的窗口中)时遇到困难,然后在继续之前等待它们终止。

我开始使用下面的(示例命令),命令将花费一个小时左右来完成:

invoke-expression 'cmd /c start powershell -Command {GetSeriesDate -- '2016-01-01'}'

但是这似乎不等待新窗口在继续之前终止。

我也调查了start-jobwait-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?

2 个答案:

答案 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