Подтвердить что ты не робот

Захват EXE-вывода в PowerShell

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

Мне поручили шифровать файлы с помощью Powershell script с помощью 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

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

Любые идеи? Я в отчаянии!

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

Стобор ответ велик. Я добавляю к его ответу, потому что мне нужно было выполнить дополнительные действия, если у 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 [email protected] -subject "Error in gpg " -body "Error:`n$out" -from [email protected] -smtpserver smtp.example.com
}
$out | out-file gpgout.txt

Ответ 4

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

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

Ответ 5

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

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

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