Перенаправление стандартного ввода \ вывода в Windows PowerShell

Какой синтаксис необходим для перенаправления стандартного ввода / вывода в Windows PowerShell?

В Unix мы используем:

$./program <input.txt >output.txt

Как выполнить ту же задачу в PowerShell?

6 ответов

Решение

Вы не можете подключить файл напрямую к stdin, но вы все равно можете получить доступ к stdin.

Get-Content input.txt | ./program > output.txt

Если кто-то ищет альтернативу Get-Content для больших файлов (как я), вы можете использовать CMD в PowerShell:

cmd.exe /c ".\program < .\input.txt"

Или вы можете использовать эту команду PowerShell:

Start-Process .\program.exe -RedirectStandardInput .\input.txt -NoNewWindow -Wait

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

РЕДАКТИРОВАТЬ:

Чтобы получить вывод из Start-Process, вы можете использовать опцию

-RedirectStandardOutput

для перенаправления вывода в файл и последующего чтения из файла:

Start-Process ".\program.exe" -RedirectStandardInput ".\input.txt" -RedirectStandardOutput ".\temp.txt" -NoNewWindow -Wait
$Result = Get-Content ".\temp.txt"

Для перенаправления вывода вы можете использовать:

  command >  filename      Redirect command output to a file (overwrite)

  command >> filename      APPEND into a file

  command 2> filename      Redirect Errors 

Перенаправление ввода работает по-другому. Например, посмотрите этот командлет http://technet.microsoft.com/en-us/library/ee176843.aspx

Или вы можете сделать:

что-то типа:

$proc = Start-Process "my.exe" "exe commandline arguments" -PassThru -wait -NoNewWindow -RedirectStandardError "path to error file" -redirectstandardinput "path to a file from where input comes"

если вы хотите узнать, возникла ли ошибка в процессе, добавьте следующий код:

$exitCode = $proc.get_ExitCode()

if ($exitCode){
    $errItem = Get-Item "path to error file"
    if ($errItem.length -gt 0){
        $errors = Get-Content "path to error file" | Out-String
    }
}

Я считаю, что таким образом я лучше справляюсь с выполнением ваших скриптов, когда вам нужно обрабатывать внешнюю программу / процесс. В противном случае я сталкивался с ситуациями, когда сценарий зависал бы при некоторых ошибках внешнего процесса.

Вы также можете сделать это, чтобы стандартная ошибка и стандартный выход находились в одном месте:

get-childitem foo 2>&1> журнал

Обратите внимание, что ">" совпадает с "| out-file", и по умолчанию используется кодировка unicode или utf 16. Также будьте осторожны с ">>", потому что он может смешивать ascii и unicode в одном текстовом файле. "| add-content", вероятно, работает лучше, чем ">>". "| set-content" может быть предпочтительнее ">".

Сейчас 6 потоков. Дополнительная информация: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_redirection?view=powershell-5.1

Я думаю, все, что вы можете сделать, это сохранить в текстовый файл, а затем прочитать его в переменной.

Я использую PowerShell v7.3.x иGet-Contentбыл связан с . Чтобы проверить свой PS, сделайтеGet-Command cat

Сcatбольше похоже на оболочку, я делаюcat contentзатем|(труба), затемexeна который мы хотим перенаправить ввод.

Либо используйте absolute pathsили invoke from within dir

      PS C:\user\working-dir > cat .\input | .\program.exe 

Прикрепленный фрагмент экрана

Другие вопросы по тегам