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

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

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

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

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

Ответы

Ответ 1

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

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

Ответ 2

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

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

  command >> filename      APPEND into a file

  command 2> filename      Redirect Errors 

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

Ответ 3

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

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

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

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

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

EDIT:

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

-RedirectStandardOutput

для перенаправления вывода в файл (как предложено в js2010), а затем чтения его из файла:

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

Ответ 4

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

get-childitem foo 2> & 1> log

Обратите внимание, что ">" совпадает с "| 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

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

Ответ 5

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

что-то вроде:

$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
    }
}

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