2013-04-03 190 views
4

無論出於何種原因,當我嘗試調用我正在編寫的C#程序時,我嘗試在命令行中使用' - '傳遞兩個參數,Powershell不用我的命令行調用程序。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運行相同的命令行一切都按預期工作。

+0

進一步說明。顯然這兩個' - '不是全部問題。看起來powershell dropbx是第一個' - ',即使第二個不在那裏。看起來像 - 必須對PowerShell有特殊意義。 –

回答

4

雙連字符指示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 

爲了避免這種情況,你必須要麼引用("--"'--')或逃生(`--)與雙連字符。

+0

您可以在某處描述「 - 」的目的以及它如何指示PS執行此操作時引用文檔嗎? –

+0

[This answer](http://stackoverflow.com/a/12198146/1630171)從@ravikanth到一個類似的問題引用了「Windows PowerShell in Action」,但除此之外我沒有一個源代碼。它與其他shell一致,但是(例如'bash')。 –

+0

下面是在PowerShell中運行可執行文件的源代碼,值得一看:http://social.technet.microsoft.com/wiki/contents/articles/7703.powershell-running-executables.aspx – JamieSee

-2

哇。有時候我真的很討厭powershell。看來解釋者認爲' - '是減量操作符或其他東西。如果我在 - 參數之前加上轉義字符,即使用命令行:

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

一切都很好。

正如我所說,有時我真的很討厭powershell。希望這可以幫助其他人解決這個問題。

+1

你的解決方案正在工作,但你的解釋是錯誤的。 –

6

PowerShell 3你可以使用 - %來停止正常解析的PowerShell。

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