1

所以这是我正在尝试做的一个示例:

Invoke-Command [Connection Info] -ScriptBlock {
    param (
        [various parameters]
    )
    Start-Process [some .exe] -Wait
} -ArgumentList [various parameters]

它可以很好地连接到另一台机器,并且可以正常启动该过程。问题是它在继续之前不会等待该过程完成。这会导致问题。有任何想法吗?

快速编辑:为什么远程运行进程时-Wait参数会失败?

4

3 回答 3

4

我以前遇到过一次,IIRC,解决方法是:

Invoke-Command [Connection Info] -ScriptBlock {
    param (
        [various parameters]
    )
    $process = Start-Process [some .exe] -Wait -Passthru

    do {Start-Sleep -Seconds 1 }
     until ($Process.HasExited)

} -ArgumentList [various parameters]
于 2014-06-09T22:31:27.130 回答
3

这是 Powershell 版本 3 的问题,但不是-Wait应该正常工作的版本 2。

在 Powershell 3 .WaitForExit()中对我有用:

$p = Start-Process [some .exe] -Wait -Passthru
$p.WaitForExit()
if ($p.ExitCode -ne 0) {
    throw "failed"
}

只需Start-Sleep直到.HasExited - 不设置.ExitCode,通常最好知道你的 .exe 是如何完成的。

于 2014-10-09T16:43:02.407 回答
1

您也可以使用 System.Diagnostics.Process 类解决此问题。如果您不关心输出,您可以使用:

Invoke-Command [Connection Info] -ScriptBlock {
$psi = new-object System.Diagnostics.ProcessStartInfo
$psi.FileName = "powershell.exe"
$psi.Arguments = "dir c:\windows\fonts"
$proc = [System.Diagnostics.Process]::Start($psi)
$proc.WaitForExit()
}

如果您确实关心,您可以执行类似以下的操作:

Invoke-Command [Connection Info] -ScriptBlock {
$psi = new-object System.Diagnostics.ProcessStartInfo
$psi.FileName = "powershell.exe"
$psi.Arguments = "dir c:\windows\fonts"
$psi.UseShellExecute = $false
$psi.RedirectStandardOutput = $true
$proc = [System.Diagnostics.Process]::Start($psi)
$proc.StandardOutput.ReadToEnd()
}

这将等待该过程完成,然后返回标准输出流。

于 2014-06-10T06:01:58.193 回答