【问题标题】:Command Line Argument (how to reserve the next argument for a parameter labeled)命令行参数(如何为标记的参数保留下一个参数)
【发布时间】:2013-10-10 03:55:28
【问题描述】:

我很想知道这样的事情有多简单。将每个参数硬编码到位很难进行故障排除,而且除了循环遍历它们之外,我不确定参数解析是如何工作的。

public static Main(string args[])
{
     for(int i = 0; i < args.Length; i++)
     {
          if(args[i] == "-path")
          {
               path = args[i++];
          }
     //bleh
     }
}

我确定我在使用循环时遗漏了一个简单的概念,例如增量..?

更新:

这是我要走的临时路线。我可能会切换它。但现在我得到 Empty path name is not valid

for(int i = 0; i < 0; i++)
{
    if(args[0] == "-logpath" && (args[1].Contains("%") || args[1].ToLower().Contains("C") || args[1].Contains("\\")))
    {
        logpath = args[1];
    }
    if(args[2] == "-idpath" && (args[3].Contains("%") || args[3].ToLower().Contains("C") || args[3].Contains("\\")))
    {
        serverIDpath = args[3];
    }
    if(args[4] == "-queuepath" && (args[5].Contains("%") || args[5].ToLower().Contains("C") || args[5].Contains("\\")))
    {
        servqueuepath = args[5];
    }
    if(args[6] == "-ramlimit" && 0 < Convert.ToInt32(args[7]))
    {
        ramlimit = args[7];
    }
    if(args[8] == "-paramsname" && (!args[11].Contains("\\") || !args[11].Contains(":")) && (args[11].Contains(".cmd") || args[11].ToLower().Contains(".txt") || args[11].Contains("bat")))
    {
        spname = args[9];
    }
    if(args[10] == "-idname" && (!args[11].Contains("\\") || !args[11].Contains(":")) && (args[11].Contains(".cmd") || args[11].ToLower().Contains(".txt") || args[11].Contains("bat")))
    {
        sidname = args[111];
    }
    if(args[12] == "-resourcetxtpath" && (args[13].Contains("%") || args[13].ToLower().Contains("C") || args[13].Contains("\\")))
    {
        resourcetxt = args[13];
    }
    if(args[14] == "-sysresource" && (args[15].Contains("%") || args[15].ToUpper().Contains("C") || args[15].Contains("\\")))
    {
        ramoutput = args[15];
    }
    if(args[16] == "-updatepath" && (args[17].Contains("%") || args[17].ToLower().Contains("C") || args[17].Contains("\\")))
    {
        makeserverpath = args[17];
    }
    if(args[18] == "-servelogpath" && (args[19].Contains("%") || args[19].ToLower().Contains("C") || args[19].Contains("\\")))
    {
        Logpath = args[19];
    }
    if(args[20] == "-fileserve" && (args[21].Contains("%") || args[21].ToLower().Contains("C") || args[21].Contains("\\")))
    {
        fileservepath = args[21];
    }
}

批处理文件:

set rootpath=%userprofile%\desktop
cd "%rootpath%
fileread -logpath %rootpath%\fr_log.txt -idpath %rootpath%\ -queuepath %rootpath%\queuecheck.txt -ramlimit 1600 -paramsname serverparams.cmd -idname serverid.cmd -resourcetxtpath %rootpath%\ramcheck.txt -sysresource %rootpath%\sysresourceoutput.exe -updatepath %rootpath%\update.bat -servelogpath %rootpath%\fsrv_log.txt -fileserve %rootpath%\FileServe.exe

【问题讨论】:

  • 你的例子似乎是正确的。你还需要什么?我还要做的是检查每个选项是否有关联的值。也就是说,确保args[i++] 没有得到无效的引用。永远不要相信用户的输入......
  • 我可能会走那条路。哈哈,忽略 %rootpath% 和 args[111] 之前的 "
  • 也许我会提出一个新问题。我还没有找到丢失的路径偶然事件。

标签: c# command-line-arguments


【解决方案1】:

Codeplex - Command Line Parser Library 上有一个很酷的项目,它会为您解析参数。(NuGet 包:Install-Package CommandLineParser)

【讨论】:

  • 我会用这个..最终。
猜你喜欢
  • 1970-01-01
  • 2014-05-11
  • 2017-12-08
  • 2016-03-25
  • 2011-04-04
  • 2015-04-11
  • 1970-01-01
  • 2012-02-25
  • 1970-01-01
相关资源
最近更新 更多