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

时间:2015-02-24 19:45:27

标签: powershell syntax

在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语法的基本部分是什么?

2 个答案:

答案 0 :(得分:5)

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

Disassembled <code>Write-Output</code>

我的猜测是处理文本的标记生成器会尝试将以-开头的任何内容与声明的参数进行匹配。如果做不到这一点,它会将其作为-InputObject中的项目传递给管道。由于.不能是变量名称的一部分,因此不能成为交换机名称的一部分,因此它可能会在执行if检查之前将其分开,并且当它变成一个参数时它不会变为&#39} ; t将其与令牌的其余部分一起备份。因此,您可能会发现一个小错误。

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

这是所有猜想,但我很乐意看到与你一样的权威答案。

修改

我所说的证据:

PS> echo -NoEnumerate.foo
.foo

答案 1 :(得分:1)

FYI不确定George是否试图提及,但echo是PowerShell中Write-Output的别名。

PS C:\temp> Get-Alias echo

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

在示例echo -abc.def.ghi中,解析器将未加引号的连字符视为参数/开关名称的前缀。期间也有特殊意义。参数不能包含句点,因此解析器将其视为字符串终止符。

作为一个整体write-output将其视为一个数组,因此它与-InputObject

位置匹配

(我希望我的断言并非完全错误。)