我正在尝试将命令行参数传递给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"
问题是我可以正确地得到第一个和第二个args,但最后得到的是C:\Documents
。
任何帮助?
答案 0 :(得分:27)
我刚刚检查并验证了问题。这令我感到惊讶,但它是第一个论点中的最后一个。
"C:\Program Files\Application name\" <== remove the last '\'
这需要更多解释,有人有想法吗?我倾向于把它称为一个错误。
第2部分,我又进行了一些测试和
"X:\\aa aa\\" "X:\\aa aa\" next
变为
X:\\aa aa\
X:\\aa aa" next
一点点Google动作可以提供blog by Jon Galloway的一些见解,基本规则是:
答案 1 :(得分:5)
添加Ian Kemp的回答
如果您的程序集被称为“myProg.exe”,并且您传入字符串“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"
字符串“C:\ Documents and Settings \ All Users \ Start Menu \ Programs \ App name”
将在args [0]。
答案 2 :(得分:1)
要添加其他人已经说过的内容,这可能是一个逃避问题。你应该通过另一个反斜杠来逃避你的反斜杠。
应该是这样的:
C:\&gt; myprog.exe“C:\\ Documents and Settings \\ All Users \\ Start Menu \\ Programs \\ App name”
答案 3 :(得分:1)
我最近注意到了同样烦人的问题,并决定编写一个解析器来自行解析命令行参数数组。
注意:问题是.NET CommandLine Arguments传递给静态void Main(string [] args)函数转义为\“和\\。这是设计的,因为你可能实际上想要传递一个参数引用或反斜杠。例如:
说你想把以下内容作为一个参数传递:
-msg:嘿,“你在哪里?”
例如
sampleapp -msg:“嘿,”你在哪里 在?\ “”
将如何使用默认行为发送它。
如果您没有看到任何人必须为您的程序转义引号或反斜杠的原因,您可以使用自己的解析器来解析命令行,如下所示。
IE。 [program] .exe“C:\ test \”arg1 arg2
会有一个args [0] = c:\ test“arg1 arg2
你期望的是args [0] = c:\ test \然后是args [1] = arg1和args [2] = arg2。
下面的函数将参数解析为具有此简化行为的列表。
注意,arg [0]是使用以下代码的程序名称。 (您可以调用List.ToArray()将结果列表转换为字符串数组。)
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;
}
答案 4 :(得分:1)
在回答WWC的回答时,Jamezor评论说,如果第一个字符是引用,他的代码将会失败。
要解决该问题,可以使用以下命令替换StartToken案例:
if (eps == enumParseState.StartToken)
{
if (rWhiteSpace.IsMatch(c.ToString()))
{
//Skip whitespace
}
else if (c == '"')
{
eps = enumParseState.InQuote;
}
else
{
token.Append(c);
eps = enumParseState.InToken;
}
}
答案 5 :(得分:0)
究竟是什么问题?无论如何,这里有一些一般的建议:
确保您的Main方法(在Program.cs中)定义为:
void Main(string[] args)
然后args是一个包含命令行参数的数组。