Process和WaitForExit而不是
我试图从PowerShell运行程序,等待退出,然后访问ExitCode,但没有多少运气。 我不想使用-Wait和Start-Process,因为我需要在后台进行一些处理。
这是一个简化的测试脚本:
cd "C:Windows"
# ExitCode is available when using -Wait...
Write-Host "Starting Notepad with -Wait - return code will be available"
$process = (Start-Process -FilePath "notepad.exe" -PassThru -Wait)
Write-Host "Process finished with return code: " $process.ExitCode
# ExitCode is not available when waiting separately
Write-Host "Starting Notepad without -Wait - return code will NOT be available"
$process = (Start-Process -FilePath "notepad.exe" -PassThru)
$process.WaitForExit()
Write-Host "Process exit code should be here: " $process.ExitCode
运行此脚本将导致记事本启动。 手动关闭后,退出代码将被打印,并且将重新开始,而不使用-wait。 退出时不提供ExitCode:
Starting Notepad with -Wait - return code will be available
Process finished with return code: 0
Starting Notepad without -Wait - return code will NOT be available
Process exit code should be here:
我需要能够在启动程序和等待它退出之间执行额外的处理,所以我不能使用-Wait。 任何想法如何做到这一点,仍然可以访问该过程中的.ExitCode属性?
你可以做的两件事情我认为...
你可以这样做:
$pinfo = New-Object System.Diagnostics.ProcessStartInfo
$pinfo.FileName = "notepad.exe"
$pinfo.RedirectStandardError = $true
$pinfo.RedirectStandardOutput = $true
$pinfo.UseShellExecute = $false
$pinfo.Arguments = ""
$p = New-Object System.Diagnostics.Process
$p.StartInfo = $pinfo
$p.Start() | Out-Null
#Do Other Stuff Here....
$p.WaitForExit()
$p.ExitCode
要么
Start-Job -Name DoSomething -ScriptBlock {
& ping.exe somehost
Write-Output $LASTEXITCODE
}
#Do other stuff here
Get-Job -Name DoSomething | Wait-Job | Receive-Job
这里有两件事要记住。 一个是添加-PassThru参数,另外两个是添加-Wait参数。 您需要添加wait参数,因为此缺陷http://connect.microsoft.com/PowerShell/feedback/details/520554/start-process-does-not-return-exitcode-property
-PassThru [<SwitchParameter>]
Returns a process object for each process that the cmdlet started. By d
efault, this cmdlet does not generate any output.
一旦你完成了这个过程对象的传递,你可以看看该对象的ExitCode属性。 这里是一个例子:
$process = start-process ping.exe -windowstyle Hidden -ArgumentList "-n 1 -w 127.0.0.1" -PassThru -Wait
$process.ExitCode
# this will print 1
如果您在没有-PassThru或-Wait的情况下运行它,它将不会打印任何内容。
同样的答案在这里:https://stackoverflow.com/a/7109778/17822
在尝试上面的最终建议时,我发现了一个更简单的解决方案。 我只需要缓存进程句柄。 只要我这样做,$ process.ExitCode工作正常。 如果我没有缓存进程句柄,$ process.ExitCode为null。
例:
$proc = Start-Process $msbuild -PassThru
$handle = $proc.Handle # cache proc.Handle http://stackoverflow.com/a/23797762/1479211
$proc.WaitForExit();
if ($proc.ExitCode -ne 0) {
Write-Warning "$_ exited with status code $($proc.ExitCode)"
}
链接地址: http://www.djcxy.com/p/89651.html