TLDR: Почему я не могу передать потоковый вывод между двумя экземплярами POWERSHELL.exe?
Я хочу привязать файл input.txt
и передать его содержимое к любому CLI, который принимает STDIN. Потребителем может быть PowerShell.exe, php.exe, awk, python, sed и т. Д.
Я предполагаю, что STDIN и STDOUT являются универсальными понятиями, о которых говорят все CLI, и, таким образом, я должен быть в состоянии успешно передавать команды CMD / DOS в / из POWERSHELL.exe.
input.txt:
hello
world
Мой желаемый режим работы заключается в том, что при добавлении строк в input.txt
они немедленно передаются в CLI, который принимает STDIN. Из PowerShell это можно смоделировать как:
Get-Content -Wait input.txt | ForEach-Object {$_}
Это работает так, как я хочу, за исключением дополнительных строк, которые не имеют значения здесь:
hello
world
I'm adding lines and saving and...
...they appear here...
yaaaay
Теперь я инкапсулирую эту хвостовую функциональность как tail.ps1
, а затем создаю простой потребительский скрипт process.ps1
, который объединю в цепочку:
tail.ps1:
Get-Content -Watch .\input.txt
process.ps1:
process {
$_
}
Я явно использую блок process{}
, потому что я хочу потоковый трубопровод, а не какой-то end{}
цикл блока.
Опять же, это работает из оболочки PowerShell:
PS> .\tail.ps1 | .\process.ps1
hello
world
here is a new line saved to input.txt
Теперь я хочу рассмотреть каждый из этих сценариев как отдельный CLI, который можно вызвать из CMD / DOS:
C:\>POWERSHELL -f tail.ps1 | POWERShell -f process.ps1
Это не работает - ничего не выводится, и мой вопрос: ПОЧЕМУ НЕ ??
Также просто отправка некоторого ввода в powershell.exe process.ps1
не производит вывода:
C:\>type input.txt | POWERSHELL -f process.ps1
Однако передача из PowerShell, скажем, в AWK работает:
C:\>POWERSHELL -f tail.ps1 | awk /e/
Hello
here is a newline with an e
so we're good
Почему AWK принимает трубопроводные линии, а POWERShell process.ps1
нет?
Еще один загадочный пример запускается из CMD / DOS:
C:\>powershell -c "'hello';'world'"
hello
world << This is as it should be
C:\>powershell -c "'hello';'world'" | powershell -f process.ps1
<< No output appears - why not!?
W:\other>powershell -c "'hello';'world'" | powershell -c "$input"
hello
world << Powershell does get the stdin