在PowerShell中捕获EXE输出

时间:2009-05-28 04:22:37

标签: powershell

首先是一点背景。

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

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

& $gpgLocation --import "key.txt"

$ gpgLocation只是gpg.exe的文件位置(默认为“C:\ Program Files \ GNU \ GnuPG \ gpg.exe”

我的完整问题是,如果我尝试:

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

我得到的是一个1kb文件,名称相应,但它完全是空白的。我已经为out-file尝试了几个标志,看看我是否遇到了怪癖。

我也尝试将命令发送到此代码(并使用通常的out-file等捕获输出):

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 个答案:

答案 0 :(得分:34)

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

这有用吗?

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

答案 1 :(得分:6)

您也可以使用Out-Host,如下所示。

& $gpgLocation --import "key.txt" | Out-Host

答案 2 :(得分:6)

Stobor的答案很棒。我正在添加他的答案,因为如果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

答案 3 :(得分:3)

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

如果PowerShell ISE无法在图形控制台中显示输出,那么您也无法捕获它,并且可能需要一些其他方法来自动执行该程序。

答案 4 :(得分:3)

在自动化GPG.EXE时需要使用--batch开关,如:

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

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