以下是我正在尝试做的一个示例:
Invoke-Command [Connection Info] -ScriptBlock {
param (
[various parameters]
)
Start-Process [some .exe] -Wait
} -ArgumentList [various parameters]
它可以很好地连接到其他机器,并且启动过程很好。问题是它不会在继续之前等待该过程完成。这会导致问题。有什么想法吗?
快速编辑:为什么远程运行进程时-Wait参数失败?
答案 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()
}
这将等待进程完成,然后返回标准输出流。