代码之家  ›  专栏  ›  技术社区  ›  CLR

在PowerShell中捕获exe输出

  •  28
  • CLR  · 技术社区  · 15 年前

    先来点背景。

    我的任务是用一个使用gpg(gnupg.org)的PowerShell脚本加密文件。我调用的特定exe只是gpg.exe。我想在每次执行命令时捕获输出。

    例如,我在PowerShell中导入一个公钥,如下所示:

    & $gpgLocation --import "key.txt"
    

    $gpg location只是gpg.exe的文件位置(默认为“c:\program files\gnu\gnupg\gpg.exe”

    我在这里的全部问题是,如果我尝试:

    & $gpgLocation --import "key.txt" | out-file gpgout.txt
    

    我得到的只是一个1KB的文件,名称适当,但它完全是空白的。我试过用几个旗子来标记输出文件,只是想看看我是否遇到了一个怪癖。

    我还尝试将命令发送到此代码(并用常规输出文件捕获输出等):

    param
    (
        [string] $processname, 
        [string] $arguments
    )
    
    $processStartInfo = New-Object System.Diagnostics.ProcessStartInfo;
    $processStartInfo.FileName = $processname;
    $processStartInfo.WorkingDirectory = (Get-Location).Path;
    if($arguments) { $processStartInfo.Arguments = $arguments }
    $processStartInfo.UseShellExecute = $false;
    $processStartInfo.RedirectStandardOutput = $true;
    
    $process = [System.Diagnostics.Process]::Start($processStartInfo);
    $process.WaitForExit();
    $process.StandardOutput.ReadToEnd();
    

    有什么想法吗?我绝望了!

    5 回复  |  直到 11 年前
        1
  •  33
  •   Stobor    15 年前

    您期望的输出是转到标准错误还是标准输出?

    这行吗?

    & $gpgLocation --import "key.txt" 2>&1 | out-file gpgout.txt
    
        2
  •  6
  •   Jon Chetan Kalore    13 年前

    您还可以使用out主机,如下所示。

    & $gpgLocation --import "key.txt" | Out-Host
    
        3
  •  6
  •   jhamm    13 年前

    斯托博的回答很好。我正在添加他的答案,因为如果exe出错,我需要执行其他操作。

    也可以将exe的输出存储到这样的变量中。然后您可以根据exe的结果进行错误处理。

    $out = $gpgLocation --import "key.txt" 2>&1
    if($out -is [System.Management.Automation.ErrorRecord]) {
        # email or some other action here
        Send-MailMessage -to me@example.com -subject "Error in gpg " -body "Error:`n$out" -from error@example.com -smtpserver smtp.example.com
    }
    $out | out-file gpgout.txt
    
        4
  •  3
  •   Josh    15 年前

    此外,PowerShell无法捕获某些程序的输出,因为它们不写入stdout。您可以通过在PowerShellISE(2.0版CTP 3)中运行程序来验证这一点。

    如果PowerShellISE无法在图形控制台中显示输出,那么您也无法捕获它,可能需要一些其他方式来实现程序自动化。

        5
  •  3
  •   Ruben Bartelink    14 年前

    自动化gpg.exe时需要使用--batch开关,如:

    & $gpgLocation --import "key.txt" --batch | out-file gpgout.txt
    

    如果没有这个开关,GPG可能正在等待用户输入。