Вызов исполняемого файла с параметрами и вывод ошибок - PullRequest
1 голос
/ 25 января 2020

Мне нужно запустить исполняемый файл, для которого требуются некоторые параметры в этой форме

c:\Program Files\Tools\Tool -p Parameter -d .....

Исполняемый файл сообщает что-то на стандартный вывод, что следует игнорировать. Строки вывода ошибок должны храниться в массиве строк для дальнейшей обработки в PowerShell.

Я пытался

$err = & "c:\Program Files\Tools\Tool -p Parameter"
Invoke-Command "c:\Program Files\Tools\Tool -p Parameter" -ErrorVariable errorOutput

Первый не перехватывает stderr. Последнее не удалось, потому что строка содержит больше, чем имя исполняемого файла. -p не является частью имени исполняемого файла. Если я опущу двойные кавычки, Invoke-Command интерпретирует -p как сокращение для «PipelineVariable».

Как запустить исполняемый файл при получении stderr?

Редактировать: Вдохновленный ответом js2010 Я пробовал это

$err = $( $output= & "c:\Program Files\Tools\Tool -p Parameter" ) 2>&1

К сожалению, результат в $ err:

Tool.exe : ==> Error: Product Bar\1.01.01 has not been found!
At line:1 char:17
+ ...  = ( $out = & "c:\Program Files\Tools\Tool -p Parameter" ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (==> Error: Prod...been found!:String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError

Очевидно, это не вывод stderr Tool.exe, но также некоторые аннотации PowerShell.

Edit2: Переменная $err по-прежнему не может использоваться, если пропущен &:

$err = $( $output= "c:\Program Files\Tools\Tool -p Parameter" ) 2>&1
Tool.exe : ==> Error: Product Bar\1.01.01 has not been found!
At line:1 char:17
+ ...  = ( $out = "c:\Program Files\Tools\Tool -p Parameter" ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (==> Error: Prod...been found!:String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError

Ответы [ 2 ]

0 голосов
/ 25 января 2020

$ err имеет сообщения об ошибках. Просто ( ) не сработает. Обе переменные получили бы оба выхода. Отредактировано для вашего примера.

$env:path += ';c:\Program Files\Tools'
$err = $( $output = Tool -p Parameter ) 2>&1
0 голосов
/ 25 января 2020

Вы можете попробовать следующее с вашим exe

Я протестировал его с одним из моих, который принимает 3 аргумента, и он работает, как ожидалось

$proc = [System.Diagnostics.Process]::Start([System.Diagnostics.ProcessStartInfo]@{
    'FileName'               = "C:\Users\Vincen\Desktop\test.exe"
    'Arguments'              = 's d qa'
    'CreateNoWindow'         = $true
    'UseShellExecute'        = $false
    'RedirectStandardOutput' = $true   # to get stdout to $proc.StandardOutput
    'RedirectStandardError'  = $true   # to get stderr to $proc.StandardError
})
$output = $proc.StandardOutput
$error1 = $proc.StandardError
#$output.ReadToEnd()
$error1.ReadToEnd()

РЕДАКТИРОВАТЬ: Добавлена ​​версия PS

$stdderror= "Error"

Start-Process -FilePath "C:\Users\XXXX\Desktop\Test.exe" -ArgumentList 's d qa' -RedirectStandardError $stdderror -RedirectStandardOutput $stddop -Wait
Get-Content $stdderror
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...