Каков требуемый синтаксис для перенаправления стандартного ввода/вывода на Windows PowerShell?
В Unix мы используем:
$./program <input.txt >output.txt
Как выполнить ту же задачу в PowerShell?
Каков требуемый синтаксис для перенаправления стандартного ввода/вывода на Windows PowerShell?
В Unix мы используем:
$./program <input.txt >output.txt
Как выполнить ту же задачу в PowerShell?
Вы не можете подключить файл напрямую к stdin, но вы все равно можете получить доступ к stdin.
Get-Content input.txt | ./program > output.txt
Для перенаправления вывода вы можете использовать:
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
Если кто-то ищет альтернативу "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"
Вы также можете сделать это, чтобы стандартная ошибка и стандартный выход пошли в одно и то же место:
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
Я думаю, что все, что вы можете сделать, это сохранить в текстовом файле, а затем прочитать его в переменную.
Или вы можете сделать:
что-то вроде:
$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
}
}
Я обнаружил, что таким образом у меня лучше справляется выполнение ваших скриптов, когда вам нужно обрабатывать внешнюю программу/процесс. В противном случае я столкнулся с ситуациями, когда скрипт зависал на некоторых внешних ошибках процесса.