12

无论出于何种原因,当我尝试调用我正在编写的 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 运行相同的命令行,一切都会按预期工作。

4

2 回答 2

12

双连字符指示 PowerShell 将后面的所有内容视为文字参数而不是选项,以便您可以将例如文字传递-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

对比

PS C:\> echo "-bar" | select-string -- -bar

-bar

为了避免这种行为,您必须引用 ( "--", '--') 或转义 ( `--) 双连字符。

于 2013-04-03T12:58:26.560 回答
8

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

.\abc.exe --% foo.txt -- bar --
于 2013-05-04T16:21:00.453 回答