【问题标题】:PowerShell Combine and Log Stderr/StdoutPowerShell 组合和记录标准错误/标准输出
【发布时间】:2014-05-15 15:59:26
【问题描述】:

如何在 PowerShell 中使用 Start-Process 模拟此命令?

my.exe < my.inp 2>&1 | tee my.log

我已尝试按照here 的建议使用 PS 3.0 扩展输出重定向,但日志文件仅包含有关该进程的信息。

$app = Start-Process -PassThru -FilePath my.exe -RedirectStandardInput my.inp 2>&1 | Tee-Object my.log
Wait-Process $app.Id

【问题讨论】:

  • 你知道PowerShell仍然不支持&lt; stdin 运算符,对吧?

标签: powershell


【解决方案1】:

不要使用-PassThru,因为它会输出一个 Process 对象以及来自您的 exe 的其他输出。此外,所有输出都分配给 $app(不仅仅是 Process 对象)。所有输出都将显示在一个单独的窗口中,该窗口在 my.exe 运行时闪烁,然后消失。看看这是否能让你继续前进:

Start-Process my.exe -NoNewWindow -Wait -RedirectStandardInput my.inp `
                     -RedirectStandardOutput foo.log `
                     -RedirectStandardError fooerr.log

【讨论】:

    【解决方案2】:

    最终使用 .NET 对象。

    $psi = New-Object System.Diagnostics.ProcessStartInfo 
    $psi.CreateNoWindow = $true
    $psi.RedirectStandardError = $true 
    $psi.UseShellExecute = $false 
    $psi.FileName = $EXE
    $psi.RedirectStandardInput = $true
    $psi.WorkingDirectory = $PWD
    
    $process = New-Object System.Diagnostics.Process 
    $process.StartInfo = $psi 
    [void]$process.Start()
    
    do
    {
        $line = $process.StandardError.ReadLine()
        $line | Tee-Object "my.log" -Append
    }
    while (!$process.HasExited)    
    
    $line = $process.StandardError.ReadToEnd()
    $line | Tee-Object "my.log" -Append    
    
    $process.Close();   
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-01
      • 2014-03-05
      • 2012-12-11
      • 2017-12-03
      • 1970-01-01
      • 1970-01-01
      • 2011-06-26
      • 1970-01-01
      相关资源
      最近更新 更多