C# 在C中传递命令行参数#
我试图将命令行参数传递给C#应用程序,但传递类似的内容时遇到问题C# 在C中传递命令行参数#,c#,command-line-arguments,C#,Command Line Arguments,我试图将命令行参数传递给C#应用程序,但传递类似的内容时遇到问题 "C:\Documents and Settings\All Users\Start Menu\Programs\App name" 即使我在参数中添加了“ "C:\Program Files\Application name\" <== remove the last '\' 这是我的密码: public ObjectModel(String[] args) { if (args.Len
"C:\Documents and Settings\All Users\Start Menu\Programs\App name"
即使我在参数中添加了“
"C:\Program Files\Application name\" <== remove the last '\'
这是我的密码:
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
有什么帮助吗?到底是什么问题?无论如何,这里有一些一般性的建议: 确保您的主要方法(在Program.cs中)定义为:
void Main(string[] args)
然后args是一个包含命令行参数的数组。添加Ian Kemp的答案 如果程序集名为“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]。要补充其他人已经说过的话,这可能是一个逃避问题。你应该用另一个反斜杠来逃避你的反斜杠 应该是这样的:
C:\>myprog.exe“C:\\Documents and Settings\\All Users\\Start Menu\\Programs\\App name”我刚刚检查并验证了问题。我很惊讶,但这是第一个论点中的最后一个
"C:\Program Files\Application name\" <== remove the last '\'
变成
X:\\aa aa\
X:\\aa aa" next
谷歌的一个小小的行动让我们从一个角度了解到,基本规则如下:
- 反斜杠是转义字符
- 总是转义引号
- 仅当反斜杠位于引号之前时才进行转义
受保护的枚举enumParseState:int{StartToken,InQuote,InToken};
公共静态列表手动解析命令行()
{
字符串CommandLineArgs=Environment.CommandLine.ToString();
Console.WriteLine(“输入的命令:+CommandLineArgs”);
List listArgs=新列表();
正则表达式rWhiteSpace=新正则表达式(“[\\s]”);
StringBuilder令牌=新的StringBuilder();
enumParseState eps=enumParseState.StartToken;
for(int i=0;i
对于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;
}
}
你想从什么开始?命令行还是其他程序?如果是后者-语言是什么?当您将这样的参数传递到应用程序中时会发生什么情况?您是否可以通过尝试访问该参数的代码以及您正在键入的完整命令行,例如c:\myapp.exe“c:\documents\appname”看起来正常,到底出了什么问题?通过从第一个参数中删除\来修复此问题。谢谢!如果你想要后面的反斜杠,你可以再加一个。也就是说,命令行上的“abd\”会导致参数“abd\”@Henk:Sorry。这里有森林/树木。我需要一个假期。这里有一个GitHub项目,它使用编码/解码方法来处理Jon Galloway提到的问题:如果第一个字符是quoteHower,那么本文中提到的链接似乎会断开。Hower:目前的情况是,如果调用
myprog.exe“c:\one\”“two”“three”
,则args[0]将是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;
}
if (eps == enumParseState.StartToken)
{
if (rWhiteSpace.IsMatch(c.ToString()))
{
//Skip whitespace
}
else if (c == '"')
{
eps = enumParseState.InQuote;
}
else
{
token.Append(c);
eps = enumParseState.InToken;
}
}