【问题标题】:c# Command Line argumentsc# 命令行参数
【发布时间】:2016-12-22 16:21:39
【问题描述】:

我试图让我的程序从命令行参数运行,所以我的代码中有 3 个选项可供您选择运行。

问题是我想解析端口和参数,我该怎么做?

每个选项都有不同的程序配置。我的尝试如下所示;所以在程序内部我也想将端口作为参数传递,所以当我在控制台中编写“程序 1 5656”时。应用程序看到它的第一个选项 1 运行,然后将 5656 解析为端口变量。

我在下面尝试过,但是当我输入命令时,它给了我错误的选项,因为它启动了选项 2 而不是 1。

class MainClass
{
    static void Main(string[] args)
    {
        // Test if input arguments were supplied:
        if (args.Length == 1)
        {
            int port = int.Parse(args[1]);
            server = new TcpListener(IPAddress.Any, port);
            //Rest of the program
        }
        if (args.Length == 2)
        {
            int port = int.Parse(args[2]);
            server = new TcpListener(IPAddress.Any, port);
            //Rest of the program
        }
        if (args.Length == 3)
        {
            int port = int.Parse(args[3]);
            server = new TcpListener(IPAddress.Any, port);
            //Rest of the program
        }
    }
}

【问题讨论】:

  • 好的,请问有什么问题?
  • 问题是我想解析端口和参数,我该怎么做? (更新了问题
  • 数组索引为 0
  • “它给了我错误的选择”并没有准确描述你在做什么或你正在看到什么。
  • @Sayse 所以你的意思是我应该从 0 开始?在港口部分?

标签: c# command-line-arguments


【解决方案1】:

看来,您希望 port 成为 last 参数:

  static void Main(string[] args) {  
    // if we have parameters...
    if (args.Length > 0) { 
      //TODO: int.TryParse is a better choice
      int port = int.Parse(args[args.Length - 1]); // ... port is the last one
      server = new TcpListener(IPAddress.Any, port);
      // Rest of the program
    }
  }

编辑:如果你想传递两个参数optionport

  static void Main(string[] args) { 
    if (args.Length == 2) {
      //TODO: int.TryParse is a better choice 
      int option = int.Parse(args[0]);
      int port = int.Parse(args[1]);

      // Rest of the program, e.g.
      if (option == 1) {
        ...  
      } 
      else if (option == 2) {
        ...
      }
      else if (option == 3) {
        ...
      }   
    }
  }

【讨论】:

  • 这样我就可以选择每个配置,所以如果我选择选项一,我会写“程序 1 1234”1 是第一个配置/选项,1234 是端口的最后一个参数。跨度>
  • @Freon:是的,据我从您的代码中可以看出,您正在寻找类似的东西,port 是最后一个参数
  • 因为就像之前我通过控制台上的用户输入获得它一样,所以就像 if (option == "1"){//Rest of program} 。现在我想做同样的事情,但只是传递参数。无论如何,当我运行你的版本时,它总是给我第一个选项,我不能选择选项 2
  • @Freon:在这种情况下,首先准确读取两个参数(optionport),然后将if 放在option 值上,而不是args.Length 上;查看我的编辑
  • 谢谢,我意识到我仍然可以使用 if 语句/switch 语句
【解决方案2】:

class Program
{
    static void Main(string[] args)
    {
        if (args.Count() > 0)
        {
            var argument = args[0];
            if (!string.IsNullOrEmpty(argument) && int.TryParse(argument, out int listEnum))
            {
                Console.WriteLine(argument);

            }
            else
            {
                Console.WriteLine("Error");
            }
        }
        Console.ReadLine();
    }
}

【讨论】:

  • 我将生成的 exe 作为示例,以 cmd 权限发送参数。
  • 我修好了,你可以再看看。
【解决方案3】:

这是你想要的吗?

class MainClass
{
    static void Main(string[] args)
    {
        // Test if input arguments were supplied:
        var switchvalue = int.Parse(args[0]);
        if (switchvalue == 1)
                {
            int port = int.Parse(args[1]);
            server = new TcpListener(IPAddress.Any, port);
            //Rest of the program
        }
        if (switchvalue == 2)
        {
            int port = int.Parse(args[1]);
            server = new TcpListener(IPAddress.Any, port);
            //Rest of the program
        }
        if (switchvalue == 3)
        {
            int port = int.Parse(args[1]);
            server = new TcpListener(IPAddress.Any, port);
            //Rest of the program
        }
    }
}

【讨论】:

  • 有点像,但是当我输入“program 1 1234”时它只是挂起,没有错误。当我在 Vstudio 上运行时,它给我的索引超出了数组的范围。
  • 啊,是的,忘记将 args 更改为 1。它现在可以工作了。很难解释我想要什么,但谢谢。不知道您可以轻松地使用 switch 语句作为 arg[0] 传递
猜你喜欢
  • 2017-06-26
  • 2013-10-09
  • 1970-01-01
  • 2013-12-26
  • 1970-01-01
  • 2023-04-06
  • 2011-07-06
  • 2011-03-23
  • 2012-01-13
相关资源
最近更新 更多