2015-02-24 23 views
6

在PowerShell窗口:为什么PowerShell会拆分包含连字符和句点的参数?

PS C:\> echo -abc.def.ghi 
-abc 
.def.ghi 

出于某种原因,连字符和周期原因Powershell的组合的参数分成两行。

它不与不带连字符出现:

PS C:\> echo abc.def.ghi 
abc.def.ghi 

它也没有发生时,有没有期限:

PS C:\> echo -abcdefghi 
-abcdefghi 

通过实验,我发现我可以逃避的行为与反引号:

PS C:\> echo `-abc.def.ghi 
-abc.def.ghi 

为什么母鹿这发生了什么?我不理解PowerShell语法的基本部分?

+1

嗯,有趣。我注意到'echo“-abc。def“'按预期工作,这可能是一个提示 – 2015-02-24 19:47:02

+1

假设你使用PowerShell V3 +,你可以使用这个'{echo -abc.def.ghi} .Ast.EndBlock.Statements [0] .PipelineElements [0] .CommandElements ''看,这是怎么解析器的。 – PetSerAl 2015-02-24 20:23:46

回答

5

我已经反汇编Microsoft.PowerShell.Utility来查看Write-Output的代码没有什么特别的,它只是通过InputObject迭代并将每个传递给由当前ICommandRuntime实现的WriteObject方法。

Disassembled <code>Write-Output</code>

我的猜测是,该处理文本标记生成器将尝试匹配任何开头的-的声明参数。如果失败了,它会通过管道将其作为-InputObject中的一个项目传递。由于.不能成为变量名称的一部分,因此不能成为交换机名称的一部分,因此它可能会在执行if检查之前将其分开,并且当它变成参数时,它不会将其与令牌的其余部分。你可能因此发现了一个小错误。

当使用反勾或引号时,它不会犯这个错误,但因为它可以标记整个事物。

虽然这都是猜测,但我很想看到一个和你一样权威的答案。

编辑我在说什么的

证据:

+1

'.'可以是变量名的一部分:'$ {几乎所有的字符都可以是变量名的一部分}'。 – PetSerAl 2015-02-24 20:26:34

+0

@PetSerAl好耶,但没有大括号,所以我的参数仍然适用,但好点, – 2015-02-24 20:28:28

+0

这不是一个bug,这是一个特性,命令-s。\ localfile'然后做你想做的事情,'command -s:localfile'也会发生同样的情况,但是对于'command -s#localfile'。 – 2015-02-24 21:14:04

1

仅供参考不知道乔治试图提及这个或没有,但echo是在PowerShell中Write-Output的别名。

PS C:\temp> Get-Alias echo 

CommandType  Name            ModuleName                     
-----------  ----            ----------                     
Alias   echo -> Write-Output  

在该示例echo -abc.def.ghi解析器看到的未引用的连字符作为前缀用于参数/交换机的名称。时期也有特殊的含义。参数不能包含句点,因此解析器将像字符串终结符那样处理。

作为一个整体write-output认为这是一个数组,因此在位置上匹配-inputobject

(我希望我没有完全错了我的说法。)

+0

那么,如果没有连字符,它*不*被认为是一个参数? – 2015-02-24 21:23:38

+1

它不会尝试去匹配它。它只是试图在那个时候定位。我也不会试图解析这段时间。这就是为什么报价是一个很好的做法 – Matt 2015-02-24 21:25:13

+1

我反对的理由是太多的Matts! – 2015-02-24 21:28:28

相关问题