Трубопровод к PowerShell из CMD - PullRequest
       1

Трубопровод к PowerShell из CMD

0 голосов
/ 14 апреля 2019

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

1 Ответ

0 голосов
/ 14 апреля 2019

У меня есть обходной путь, который хорошо вещает, хотя у меня пока нет объяснения:

process.ps1 :

begin {if($input){}}
process {
    $_
}

Кажется, безблок begin{}, который обращается к блоку $input no process{}, не введен.

Это может быть ошибкой PowerShell, поскольку он корректно работает в powershell.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...