Powershell start-process -wait参数在远程脚本块中失败

时间:2014-06-09 22:21:18

标签: powershell remoting invoke-command start-process

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

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

它可以很好地连接到其他机器,并且启动过程很好。问题是它不会在继续之前等待该过程完成。这会导致问题。有什么想法吗?

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

3 个答案:

答案 0 :(得分:3)

之前我碰到过这个,而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]

答案 1 :(得分:3)

这是Powershell版本3的问题,但不是版本2,其中 -Wait 可以正常工作。

在Powershell 3中 .WaitForExit()为我做了诀窍:

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

开始睡眠,直到 .HasExited - 未设置 .ExitCode ,通常很高兴知道.exe完成了

答案 2 :(得分: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()
}

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