首先是一点背景。
我的任务是使用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();
有什么想法吗?我很绝望!
答案 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可能正在等待用户输入。