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

Mat*_*int 6 syntax powershell

在PowerShell窗口中:

PS C:\> echo -abc.def.ghi
-abc
.def.ghi
Run Code Online (Sandbox Code Playgroud)

由于某种原因,连字符和句点的组合会导致Powershell将参数拆分为两行.

没有连字符就不会发生这种情况:

PS C:\> echo abc.def.ghi
abc.def.ghi
Run Code Online (Sandbox Code Playgroud)

当没有时期时也不会发生:

PS C:\> echo -abcdefghi
-abcdefghi
Run Code Online (Sandbox Code Playgroud)

通过实验,我发现我可以通过反复来逃避这种行为:

PS C:\> echo `-abc.def.ghi
-abc.def.ghi
Run Code Online (Sandbox Code Playgroud)

为什么会这样呢?我不理解PowerShell语法的基本部分是什么?

Geo*_*uer 5

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

反汇编的<code>-</code>声明的参数进行匹配.如果做不到这一点,它会将其作为项目传递给管道<code>-InputObject</code>.由于a <code>.</code>不能是变量名称的一部分,因此不能成为开关名称的一部分,因此它可能会在执行if检查之前将其分开,当它变成参数时,它不会将其与其余部分连接起来.令牌.因此,您可能会发现一个小错误.</p>

<p>当使用后退标记或引号时,它不会犯这个错误,因为它可以标记整个事物. </p>

<p>虽然这是猜想,但我希望能像你一样看到权威的答案.</p>

<p><strong>编辑</strong></p>

<p>我所说的证据:</p>

<pre><code>PS> echo -NoEnumerate.foo
.foo
</code></pre><a target=Run Code Online (Sandbox Code Playgroud)