PowerShell命令行参数和'--'

15

由于某些原因,当我尝试在命令行中使用带有“--”的两个参数调用我正在编写的C#程序时,PowerShell不会执行我的命令行。

例如,我提供了以下命令行:

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

取代

foo.txt -- bar --

正如预期的那样。

为什么会发生这种情况呢?

顺便说一下,如果我这样调用它:

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

它的效果符合预期。

同时,将它调用为:

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

看起来没有帮助。

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


进一步说明。显然,两个“--”并不是整个问题的全部。似乎PowerShell会删除第一个“--”,即使第二个不存在。看起来“--”对于PowerShell必须具有特殊含义。 - Kelly L
2个回答

14

两个连字符指示 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

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

你能否提供一个文档的参考,描述'--'的目的以及它如何指示PS执行此操作? - Kelly L
来自@ravikanth的这个答案针对一个类似的问题引用了《Windows PowerShell in Action》,但除此之外我没有其他来源。不过这与其他shell是一致的(例如bash)。 - Ansgar Wiechers
这里有一个值得一看的在PowerShell中运行可执行文件的源代码:http://social.technet.microsoft.com/wiki/contents/articles/7703.powershell-running-executables.aspx - JamieSee
@JamieSee 我在那篇文章中没有看到双破折号的讨论,只有 PowerShell v3 中引入的“停止解析”参数(--%). - Ansgar Wiechers
如果有人在寻找关于这个--特性的官方文档,在这里可以找到。 - Mariusz Pawelski

9
使用PowerShell 3,你可以使用--%来停止PowerShell进行的普通解析。
.\abc.exe --% foo.txt -- bar --

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接