Powershell - получить вывод консоли в переменную (не stdout, не stderror) - PullRequest
2 голосов
/ 03 февраля 2020

У меня есть exe от Lenovo, который обеспечивает вывод командной строки только при запуске из окна cmd, но не из PowerShell. Похоже, что вывод идет из источника-призрака, отличного от StdOut или StdErr.
https://download.lenovo.com/pccbbs/mobiles/n2hgc06w.exe (вам нужно запустить и нажать кнопку установки, но все, что нужно сделать, это распаковать в c: \ drivers \ win \ touchpadfw). Обязательно отмените запрос установки после извлечения.

Эта команда дает мне вывод на консоль

& cmd.exe /c c:\drivers\win\touchpadfw\touchpadfw_aug2019\synreflash.exe /v /S 2

Это также дает мне вывод консоли и ничего в переменной

$var = (& cmd.exe /c c:\drivers\win\touchpadfw\touchpadfw_aug2019\synreflash.exe /v /S 2) 2>&1

То же самое здесь

$var = (& cmd.exe /c c:\drivers\win\touchpadfw\touchpadfw_aug2019\synreflash.exe /v /S 2 2>&1) 

Мне кажется, что этот exe-файл выводится не так, как StdOut и StdErr, но я не знаю что. Ничто из того, что я пробовал, не может отразить то, что выводится. Есть ли третий способ вывода?

Вот где это становится странным. Используя «start cmd», чтобы открыть окно cmd из административной оболочки PowerShell, я запускаю exe-файл непосредственно в окне cmd, но вывод идет в родительскую консоль PowerShell. Я не могу получить никакого вывода, если я запускаю окно cmd от имени администратора.

1 Ответ

0 голосов
/ 03 февраля 2020

Посмотрите на использование SynRefla sh ниже, вы заметите, что вам нужно будет передать последний аргумент как /S 3 явно, печать до Standard Output в отличие от /S 2 в тихом режиме


enter image description here

$cmdOutput = cmd.exe /c "C:\DRIVERS\WIN\TouchpadFW\n2hgc06w\synreflash.exe" /v /S 3 '2>&1'

ИЛИ


proc = [System.Diagnostics.Process]::Start([System.Diagnostics.ProcessStartInfo]@
{
    'FileName'               = "cmd.exe"
    'Arguments'              = "/C " + """C:\DRIVERS\WIN\TouchpadFW\n2hgc06w\synreflash.exe"" /v /s 3"
    '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
write-host $output.ReadToEnd()


Выход

FW Версия: 1.2

...