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属性?


你可以做的两件事情我认为...

  • 手动创建System.Diagnostics.Process对象并绕过Start-Process
  • 在后台作业中运行可执行文件(仅适用于非交互式进程!)
  • 你可以这样做:

    $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

    上一篇: Process and WaitForExit instead of

    下一篇: Error using Apple frameworks in my CocoaPod podspec?