我想通过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在读取多行命令时会遇到任何问题?
答案 0 :(得分:4)
我会考虑这个回答:
How to end a multi-line command in PowerShell因为它表明需要额外的换行符。
但是,我会将此问题提交给MS作为错误,因为从非tty读取或指定-NonInteractive
开关时不应该这样做。
答案 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处理输入的方式有些不清楚,有或没有换行符。