Powershell无法从stdin运行多行命令?

时间:2016-05-24 15:15:33

标签: powershell stdin multiline

我想通过stdin将任意脚本传递给Powershell。 (实际上,我希望避免将脚本放入临时文件中,但出于这个问题的目的,我会将文件的内容传递给powershell。)

所以我做了类似的事情(在本例中,来自Windows cmd shell):

type myfile.txt | powershell -

如果myfile.txt包含这样的内容,那么它可以工作:

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

(输出2\n4\n6\ndone。) 但是,如果我将这个第一个语句分成多行,那么Powershell根本不存在任何输出:

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

对于任何多行语句,这似乎都失败了。例如,这也无法产生输出:

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

我对此感到惊讶,因为每个都是合法的Powershell脚本,如果放入.ps1文件并正常运行,它们将正常工作。

我尝试过各种各样的事情,包括使用续行字符逃避EOL,但无济于事。如果父shell是Powershell,甚至是Python(使用带有stdin = PIPE的subprocess.Popen),也会产生相同的效果。在每种情况下,Powershell都会在没有任何错误的情况下退出,退出代码为0.

有趣的是,如果我运行以下内容,只有" before.txt"得到了。

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

如果从stdin读取,为什么Powershell在读取多行命令时会遇到任何问题?

2 个答案:

答案 0 :(得分:4)

我会考虑这个回答: How to end a multi-line command in PowerShell因为它表明需要额外的换行符。 但是,我会将此问题提交给MS作为错误,因为从非tty读取或指定-NonInteractive开关时不应该这样做。

Please vote on my bug report to the Powershell team

答案 1 :(得分:1)

这不是一个完整的答案,但据我所知,问题与逐行发送的输入有关。

为了演示逐行问题,我以这种方式调用powershell:

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

VS

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

第一个示例复制了您使用type看到的内容,第二个示例读取文件的全部内容,并按预期工作。

如果您将脚本内容放在字符串中并将其传递到powershell.exe -中,它也可以在PowerShell中运行。

我有一个理论认为它与缺少换行符的逐行输入有关,但它并不是那么明确。如果是这种情况,为什么第一个选项可以工作而不是第二个选项(删除分裂单个管道的换行符应该没有效果,同时删除管道和echo之间的换行符应该使它失败) 。也许有一些关于powershell处理输入的方式有些不清楚,有或没有换行符。