Перенаправление стандартного ввода \ вывода в 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