PowerShell的调用运算符(&)语法和双引号

时间:2012-01-18 04:33:47

标签: powershell

有人可以向我解释这个结果吗?多年来我试图掌握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?

2 个答案:

答案 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\\\bde fgh

答案 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参数非常混乱。