在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语法的基本部分是什么?
答案 0 :(得分:5)
我已经反汇编了Microsoft.PowerShell.Utility来查看Write-Output
的代码没什么特别的,它只是遍历InputObject并将每个传递给当前WriteObject
方法实现的ICommandRuntime
方法{1}}。
我的猜测是处理文本的标记生成器会尝试将以-
开头的任何内容与声明的参数进行匹配。如果做不到这一点,它会将其作为-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
(我希望我的断言并非完全错误。)