有人可以向我解释这个结果吗?多年来我试图掌握PowerShell调用命令的语法浪费了很多时间,但是这......我甚至无法猜测如何从输入中获得这个结果。
PS C:\Users\P> & echoargs " ""1"" 2 3 ""4 5 6"" 7 8 9"
Arg 0 is < 1 2 3 4>
Arg 1 is <5>
Arg 2 is <6 7 8 9>
Bueller?
答案 0 :(得分:4)
双引号字符串中的双倍引号是插入双引号的一种方式。 echoargs.exe的更新版本更清楚地显示了这一点,因为它显示了用于调用exe的命令行:
PS> echoargs " ""1"" 2 3 ""4 5 6"" 7 8 9"
Arg 0 is < 1 2 3 4>
Arg 1 is <5>
Arg 2 is <6 7 8 9>
Command line:
"C:\...\Modules\Pscx\Apps\EchoArgs.exe" " "1" 2 3 "4 5 6" 7 8 9"
如果您使用该命令行(在PowerShell解析之后),您将在CMD.exe中获得相同的结果:
CMD> EchoArgs.exe " "1" 2 3 "4 5 6" 7 8 9"
Arg 0 is < 1 2 3 4>
Arg 1 is <5>
Arg 2 is <6 7 8 9>
Command line:
C:\...\Modules\Pscx\Apps\EchoArgs.exe " "1" 2 3 "4 5 6" 7 8 9"
至于为什么.NET或C ++启动代码以这种方式解析命令行,我不完全确定。这个MSDN topic涵盖了一点,如果你看一下主题底部的例子,你会看到一些同样奇怪的解析行为,例如: a\\\b d"e f"g h
代码为a\\\b
,de fg
和h
。
答案 1 :(得分:3)
请注意,Powershell在将参数传递给应用程序并引用所述参数时会出现一些重大错误 - http://connect.microsoft.com/PowerShell/feedback/details/376207/executing-commands-which-require-quotes-and-variables-is-practically-impossible
这就是我理解它是如何(错误)解析的:
字符串为" ""1"" 2 3 ""4 5 6"" 7 8 9"
由于这个错误,双引号成为字面双引号,从来没有成功。
字符串就像“”1“2 3”4 5 6“7 8 9”
所以<space>1 2 3 4
成为一个参数,因为第一个部分带有匹配的引号,而第四个部分出现在下一个空格之前。然后是空间,因此5成为第二个参数。然后是空格,所以下一部分将是一个单独的参数。这里再次出现与第一个参数相同的规则,除了6出现在引用之前且没有空格,因此6 7 8 9
成为下一个参数。
Bottomline - 传递给外部应用程序的Powershell参数非常混乱。