PowerShell命令行参数和'--';

PowerShell命令行参数和'--';,powershell,command-line,powershell-2.0,Powershell,Command Line,Powershell 2.0,无论出于何种原因,当我试图调用我正在编写的C#程序,并试图在命令行中用“--”传递两个参数时,PowerShell不会在命令行中调用该程序 例如,我提供了命令行: .\abc.exe foo.txt -- bar -- 当我调用此函数时,C#程序的main只获取命令行参数: foo.txt bar -- 而不是 foo.txt -- bar -- 正如所料 为什么会发生这种情况 顺便说一句,如果我称之为: .\abc.exe foo.txt '--' bar '--' 它按预期工作 也可

无论出于何种原因,当我试图调用我正在编写的C#程序,并试图在命令行中用“--”传递两个参数时,PowerShell不会在命令行中调用该程序

例如,我提供了命令行:

.\abc.exe foo.txt -- bar --
当我调用此函数时,C#程序的main只获取命令行参数:

foo.txt bar --
而不是

foo.txt -- bar --
正如所料

为什么会发生这种情况

顺便说一句,如果我称之为:

.\abc.exe foo.txt '--' bar '--'
它按预期工作

也可以称之为:

& .\abc.exe foo.txt -- bar --
似乎没用


我之所以认为这是PowerShell的怪异之处,是因为如果我从CMD.EXE运行相同的命令行,一切都会按预期运行。

双连字符指示PowerShell将后面的所有内容视为文字参数而不是选项,例如,您可以将一个literal
-foo
传递给您的脚本/应用程序/cmdlet

例如:

PS C:\> echo "-bar" | select-string -bar
Select-String : A parameter cannot be found that matches parameter name 'bar'.
At line:1 char:28
+ "-bar" | select-string -bar <<<<
    + CategoryInfo          : InvalidArgument: (:) [Select-String], ParameterBindingException
    + FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.SelectStringCommand
要避免这种行为,您必须引用(
“-”
“-”
)或转义(
`-
)双连字符。

使用,您可以使用
-%
停止PowerShell的正常解析

.\abc.exe --% foo.txt -- bar --

进一步说明。显然,这两个“--”并不是问题的全部。似乎powershell会删除第一个'--',即使第二个不存在。似乎--对powershell有特殊的意义。您是否可以在某处引用描述“---”用途的文档,以及它如何指示PS执行此操作?从@ravikanth到一个类似的问题,我引用了“Windows PowerShell正在运行”,但除此之外,我没有来源。不过,它与其他shell(例如,
bash
)是一致的。下面是一个在PowerShell中运行可执行文件的源代码,非常值得一看:@JamieSee我没有看到那篇文章中讨论的双破折号,只有PowerShell v3引入的“停止解析”参数(
-%
)。
.\abc.exe --% foo.txt -- bar --