Powershell:报价解析的不一致/奇怪行为?

时间:2011-07-30 00:06:23

标签: parsing powershell double-quotes

一切!我正在尝试使用PowerShell编译程序,但该命令正在被奇怪地解析。 此命令在cmd.exe中正确执行:

dmd -od"bin" -of"bin\convHull.exe" -I"src" "src\concSort.d" "src\fileParser.d" "src\main.d" "src\pointLogic.d" "src\quickHull.d" "src\stupidHull.d" -D -O -release

但PowerShell将其执行为:( 蓝色 海军紫色文本,因为它们出现在PowerShell ISE中)

dmd -od“bin”-of“bin \ convHull .exe”-I“src”“src \ concSort.d“”src \ fileParser.d“”src \ main.d“”src \ pointLogic.d“”src \ quickHull.d“”src \ stupidHull.d“-D -O -release < / p>

这会吐出以下错误:

The string starting:
At line:1 char:147
+ dmd -od"bin" -of"bin\convHull.exe" -I"src" "src\concSort.d" "src\fileParser.d" "src\main.d"     
"src\pointLogic.d" "src\quickHull.d" "src\stupidHull.d <<<< " -D -O -release
is missing the terminator: ".
At line:1 char:163

所以它似乎将句号解释为引用。这很特别。有没有其他人在使用PowerShell时遇到此问题?

我尝试过的事情:

  1. 转义引号
  2. 确保所有引号都是“直引号”而不是角度
  3. 在引号前放置一个空格(正确解析,但程序不理解参数。)
  4. 谢谢, 查尔斯。

2 个答案:

答案 0 :(得分:2)

我相信这应该可以解决问题(仅为了清晰起见而添加换行符,并删除额外的引号):

dmd '-od"bin"' '-of"bin\convHull.exe"' '-I"src"'
    src\concSort.d src\fileParser.d src\main.d src\pointLogic.d src\quickHull.d src\stupidHull.d
    -D -O -release

请注意,如果引用(“)将作为参数本身的一部分传递,我用单引号(')包围整个参数。从下面的实验中它可以可以看出只有 -of"..."需要关于它的引用。

快乐的编码。


我找不到关于这个确切产品的好参考,但请注意以下解析:

-x"w."   ->  error: " expected (last " is special)
-x"w.""  ->  -x"w and ."" (the . starts a new token and the " in that starts
                           a quote; however, the quotes are not removed)
'-x"w."' ->  -x"w." (extra quote fine, neither special)
-x"w"    ->  -x"w"  (no . and " not special)
-x"w""   ->  -x"w"" (no . and " not special)
a".b"    ->  a.b    (didn't start with `-`, quotes removed)
a".b     ->  error: " expected (" is special)

所以它似乎确实与.-组合有关(它可能不是独占的)。从上面我相信以- 开头的令牌不包含.字符作为令牌中的有效字符,因此词法分析器终止所述令牌并启动新令牌 - 很容易通过良好的EBNF参考证明,我没有。


我能找到的最好的是Appendix C: The PowerShell Grammar

  
    

ParameterToken规则用于匹配cmdlet参数,例如-foo或 -     boolProp :.请注意,此规则也将匹配--foobar,因此此规则具有     在--token规则之前检查。

  
<ParameterToken> = -[:letter:]+[:]{0 |1}

然而,这最多是不完整的,甚至不包括“字母”的定义。

答案 1 :(得分:0)

我没有可执行文件,但这似乎想要工作。

 $cmd = @'
 dmd -od"bin" -of"bin\convHull.exe" -I"src" "src\concSort.d" "src\fileParser.d" "src\main.d" "src\pointLogic.d" "src\quickHull.d" "src\stupidHull.d" -D -O -release
 '@

 &$cmd