Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中传递命令行参数#_C#_Command Line Arguments - Fatal编程技术网

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#应用程序,但传递类似的内容时遇到问题

"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
谷歌的一个小小的行动让我们从一个角度了解到,基本规则如下:

  • 反斜杠是转义字符
  • 总是转义引号
  • 仅当反斜杠位于引号之前时才进行转义

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

注意:问题在于传递给静态void Main(string[]args)函数的.NET命令行参数转义为\“和\”。这是出于设计考虑,因为您可能实际上想要传递一个包含引号或反斜杠的参数。例如:

假设您希望将以下内容作为单个参数传递:

-味精:嘿,“你在哪里?”

例如

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

将是如何使用默认行为发送它

如果您看不到任何人必须为您的程序转义引号或反斜杠的原因,您可以使用自己的解析器来解析命令行,如下所示

即。 [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()将结果列表转换为字符串数组。)

受保护的枚举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;
                }
            }