PowerShell command line parameters and '--'

11,926

Solution 1

A double hyphen instructs PowerShell to treat everything coming after as literal arguments rather than options, so that you can pass for instance a literal -foo to your script/application/cmdlet.

Example:

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

vs.

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

-bar

To avoid this behavior you must either quote ("--", '--') or escape (`--) the double hyphen.

Solution 2

With PowerShell 3 you can use --% to stop the normal parsing PowerShell does.

.\abc.exe --% foo.txt -- bar --
Share:
11,926
Kelly L
Author by

Kelly L

Updated on June 06, 2022

Comments

  • Kelly L
    Kelly L almost 2 years

    For whatever reason, when I try to call a C# program I'm writing, and I try to pass two arguments with '--' in the command line, PowerShell doesn't call the program with my command line.

    For instance, I'm providing the command line:

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

    When I call this, the C# program's main only gets the command line arguments:

    foo.txt bar --
    

    instead of

    foo.txt -- bar --
    

    as would be expected.

    Why would this be happening?

    BTW, if I call it as:

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

    it works as expected.

    Also, calling it as:

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

    Doesn't seem to help.

    My reason for thinking this is a PowerShell weirdness is that if I run the same command line from CMD.EXE, everything works as expected.

  • Kelly L
    Kelly L over 10 years
    Can you give a reference to doc somewhere that describes the purpose of '--' and how it instructs PS to do this?
  • Ansgar Wiechers
    Ansgar Wiechers over 10 years
    This answer from @ravikanth to a similar question cites "Windows PowerShell in Action", but other than that I don't have a source. It's consistent with other shells, though (bash for instance).
  • JamieSee
    JamieSee about 8 years
    Here's a source for running executables in PowerShell that's well worth looking at: social.technet.microsoft.com/wiki/contents/articles/…
  • Ansgar Wiechers
    Ansgar Wiechers about 8 years
    @JamieSee I don't see the double-dash discussed in that article, only the "stop parsing" parameter (--%) that was introduced with PowerShell v3.