在C#中传递命令行参数

我试图将命令行parameter passing给一个C#应用程序,但我有问题传递这样的事情

"C:\Documents and Settings\All Users\Start Menu\Programs\App name" 

即使我在论据中加了" "

这是我的代码:

  public ObjectModel(String[] args) { if (args.Length == 0) return; //no command line arg. //System.Windows.Forms.MessageBox.Show(args.Length.ToString()); //System.Windows.Forms.MessageBox.Show(args[0]); //System.Windows.Forms.MessageBox.Show(args[1]); //System.Windows.Forms.MessageBox.Show(args[2]); //System.Windows.Forms.MessageBox.Show(args[3]); if (args.Length == 3) { try { RemoveInstalledFolder(args[0]); RemoveUserAccount(args[1]); RemoveShortCutFolder(args[2]); RemoveRegistryEntry(); } catch (Exception e) { } } } 

这就是我所传递的:

 C:\WINDOWS\Uninstaller.exe "C:\Program Files\Application name\" "username" "C:\Documents and Settings\All Users\Start Menu\Programs\application name" 

问题是我可以正确地得到第一个和第二个参数,但最后一个得到的是C:\Documents

任何帮助?

我只是跑了一张支票,并核实了这个问题。 这让我感到吃惊,但这是第一个论点的最后一个。

 "C:\Program Files\Application name\" <== remove the last '\' 

这需要更多的解释,有没有人有一个想法? 我倾向于把它称为一个错误。


第二部分,我进行了一些testing

 "X:\\aa aa\\" "X:\\aa aa\" next 

 X:\\aa aa\ X:\\aa aa" next 

Google的一些小动作从Jon Galloway的博客中可以看出,基本的规则是:

  • 反斜杠是转义字符
  • 总是逃避报价
  • 只有在引号前面加上反斜杠。

补充Ian Kemp的答案

如果您的程序集名为“myProg.exe”,并且您传入string“C:\ Documents and Settings \ All Users \ Start Menu \ Programs \ App name”链接

 C:\>myprog.exe "C:\Documents and Settings\All Users\Start Menu\Programs\App name" 

string“C:\ Documents and Settings \ All Users \ Start Menu \ Programs \ App name”

将在args [0]。

加上其他人已经说过的话,这可能是一个逃避的问题。 你应该用另一个反斜杠来避免你的反斜杠。

应该是这样的:

C:\> myprog.exe“C:\ Documents and Settings \\ All Users \\ Start Menu \\ Programs \\ App name”

最近我注意到了同样令人讨厌的问题,并决定编写一个parsing器来parsing我自己的命令行参数数组。

注意:问题是传递给静态无效Main(string [] args)函数的.NET CommandLine参数会转义\“和\\。这是有意devise的,因为您可能实际上想传递一个带有引号的参数反斜杠在一个例子中:

说你想通过以下作为一个单一的论点:

-msg:嘿,“你在哪?

例如。

sampleapp -msg:“嘿,”你在哪里?“”

将是如何发送它的默认行为。

如果您没有看到任何人需要为程序转义引号或反斜杠的原因,可以使用您自己的parsing器来parsing命令行,如下所示。

IE浏览器。 [program] .exe“C:\ test \”arg1 arg2

会有一个参数[0] = c:\ test“arg1 arg2

你期望的是args [0] = c:\ test \,然后是args [1] = arg1和args [2] = arg2。

下面的函数用这个简化的行为将参数parsing到列表中。

请注意,arg [0]是使用下面的代码的程序名称。 (您可以调用List.ToArray()将结果列表转换为string数组。

 protected enum enumParseState : int { StartToken, InQuote, InToken }; public static List<String> ManuallyParseCommandLine() { String CommandLineArgs = Environment.CommandLine.ToString(); Console.WriteLine("Command entered: " + CommandLineArgs); List<String> listArgs = new List<String>(); Regex rWhiteSpace = new Regex("[\\s]"); StringBuilder token = new StringBuilder(); enumParseState eps = enumParseState.StartToken; for (int i = 0; i < CommandLineArgs.Length; i++) { char c = CommandLineArgs[i]; // Console.WriteLine(c.ToString() + ", " + eps); //Looking for beginning of next token if (eps == enumParseState.StartToken) { if (rWhiteSpace.IsMatch(c.ToString())) { //Skip whitespace } else { token.Append(c); eps = enumParseState.InToken; } } else if (eps == enumParseState.InToken) { if (rWhiteSpace.IsMatch(c.ToString())) { Console.WriteLine("Token: [" + token.ToString() + "]"); listArgs.Add(token.ToString().Trim()); eps = enumParseState.StartToken; //Start new token. token.Remove(0, token.Length); } else if (c == '"') { // token.Append(c); eps = enumParseState.InQuote; } else { token.Append(c); eps = enumParseState.InToken; } } //When in a quote, white space is included in the token else if (eps == enumParseState.InQuote) { if (c == '"') { // token.Append(c); eps = enumParseState.InToken; } else { token.Append(c); eps = enumParseState.InQuote; } } } if (token.ToString() != "") { listArgs.Add(token.ToString()); Console.WriteLine("Final Token: " + token.ToString()); } return listArgs; } 

为了回应WWC的回答,Jamezor评论说,如果第一个字符是引用,他的代码将会失败。

要解决这个问题,你可以用下面的代码来replaceStartToken的情况:

  if (eps == enumParseState.StartToken) { if (rWhiteSpace.IsMatch(c.ToString())) { //Skip whitespace } else if (c == '"') { eps = enumParseState.InQuote; } else { token.Append(c); eps = enumParseState.InToken; } } 

究竟是什么问题? 无论如何,这里有一些一般的build议:

确保你的Main方法(在Program.cs中)被定义为:

 void Main(string[] args) 

然后args是一个包含命令行参数的数组。