2016-05-24 2 views
2

Я хочу передать произвольные скрипты Powershell через stdin. (На практике я бы хотел не помещать скрипт во временный файл, но для целей этого вопроса я буду передавать содержимое файла в файл powershell.)Powershell не может запускать многострочные команды из stdin?

Так что я делаю что-то как так (в данном примере, из ЦМД оболочки Windows):

type myfile.txt | powershell - 

это работает, если myfile.txt содержит что-то вроде этого: (. Она выводит 2\n4\n6\ndone)

1..3 | % { $_ *2 } 
echo done 

Однако, если я разделим это первое утверждение acr ОСС несколько линий, как это так, то Powershell просто существует, не выводя на всех:

1..3 | 
    % { $_ *2 } 
echo done 

Это, кажется, не в состоянии для любого многострочного заявления. Например, это также не в состоянии произвести вывод:

1..3 | % { 
    $_ *2 } 
echo done 

Я удивлен этим, так как каждый являются юридическими сценариями Powershell, которые будут работать нормально, если поместить в файл .ps1 и работать в нормальном режиме.

Я пробовал различные вещи, в том числе избегая EOL, используя строки продолжения строки, но безрезультатно. Тот же эффект возникает, если родительская оболочка - Powershell или даже Python (с использованием subprocess.Popen с stdin = PIPE). В каждом случае Powershell выходит без какой-либо ошибки, а код выхода равен 0.

Интересно, если я запустил следующее, создается только «before.txt».

"before" | out-file before.txt 
1..3 | 
    % { $_ *2 } 
"after" | out-file after.txt 
echo done 

Любые идеи, почему у Powershell возникнут проблемы с чтением многострочной команды, если она будет прочитана из stdin?

ответ

1

Это не полный ответ, но из того, что я могу сказать, проблема связана с тем, что ввод отправляется по строкам.

Чтобы продемонстрировать проблему линии за линией, я призываю PowerShell так:

powershell.exe -command "gc myfile.txt" | powershell.exe - 

против

powershell.exe -command "gc myfile.txt -raw" | powershell.exe - 

Первый пример повторяет то, что вы видите с type, второй читает весь содержимое файла, и оно работает так, как ожидалось.

Он также работает из PowerShell, если вы помещаете содержимое скрипта в строку и обрабатываете его в powershell.exe -.

У меня была теория, что это связано с линейным вводом, не имеющим разрывов строк, но это не так ясно. Если это так, то почему первый вариант работает, но не второй (удаление разрыва строки в одном конвейере не должно иметь эффекта, в то время как удаление разрыва строки между конвейером и echo должно привести к сбою). Может быть, есть что-то непонятное в том, как PowerShell обрабатывает вход с или без разрывов строк.

+0

Спасибо. Я только что попробовал это, и у меня получился такой же (неудачный) результат. –

+0

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

+0

@MichaelLewis: Я бы не удивился, если PowerShell разделит строки на строки, передавая их другим программам. И 'powershell' в этом случае - это программа, а не командлет. – Joey

3

Я буду считать это ответом: How to end a multi-line command in PowerShell, так как он показывает, что требуется дополнительная строка. Однако я собираюсь поднять это значение в MS как ошибку, так как это не должно требоваться при чтении из не-tty или когда указан переключатель -NonInteractive.

Please vote on my bug report to the Powershell team.

+0

Прошу проголосовать за мой [отчет об ошибке] (https://windowsserver.uservoice.com/forums/301869-powershell/suggestions/14127231) в команду Powershell. –