Записать вывод EXE в PowerShell - PullRequest
28 голосов
/ 28 мая 2009

Сначала немного фона.

Мне было поручено зашифровать файлы скриптом Powershell с помощью GPG (gnupg.org). Конкретный 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

Все, что я получаю, - это файл размером 1 КБ, названный соответствующим образом, но он ПОЛНОСТЬЮ пуст. Я попробовал несколько флагов для 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 ]

34 голосов
/ 28 мая 2009

Выходные данные, которые вы ожидаете, соответствуют стандартным ошибкам или стандартным выходам?

это работает?

& $gpgLocation --import "key.txt" 2>&1 | out-file gpgout.txt
7 голосов
/ 01 июля 2011

Вы также можете использовать Out-Host, как показано ниже.

& $gpgLocation --import "key.txt" | Out-Host
6 голосов
/ 16 августа 2011

Великолепный ответ Стобора. Я добавляю к его ответу, потому что мне нужно было выполнить дополнительные действия, если у 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 голосов
/ 28 мая 2009

Вам необходимо использовать ключ --batch при автоматизации GPG.EXE, например:

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

Без этого переключателя GPG может ожидать ввода пользователя.

3 голосов
/ 28 мая 2009

Кроме того, PowerShell просто не может захватить выходные данные некоторых программ, потому что они не записывают в стандартный вывод. Вы можете убедиться в этом, запустив программу в PowerShell ISE (она находится в версии 2.0 CTP 3)

Если PowerShell ISE не может отобразить выходные данные в графической консоли, то вы также не можете захватить их и вам может понадобиться другой способ автоматизации программы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...