【问题标题】:How to access multiple values of a CLI argument如何访问 CLI 参数的多个值
【发布时间】:2015-10-21 15:05:52
【问题描述】:

我有一个节点 JS 脚本,它通过执行 ./test.js -n name1 -r us-east 从命令行读取参数。这里有两个参数 -n-r 分别以适当的值传递。现在我必须引入另一个参数-i,它将接收至少一个值和最多多个值。意味着脚本被执行为:

./test.js -n name1 -i 100 101 103 -r us-east 
  1. 我如何找到每个参数的参数值的数量,例如在上面的示例参数-i3 值。

  2. 如何将这些值存储到数组中。

    var data = new Object();
    
    function usage()
    {
      return "test.js [-n|--name] [-i|--ids <id1 id2...>] [-r|--region] ";
    }
    
    function process_args()
    {
      var args = process.argv.slice(2);
      var i;
      for (i = 0; i > args.length; i++)
      {
            switch(args[i])
            {
            case "-n":
            case "--name":
                    i++;
                    if (i >= args.length)
                            error_exit_usage("Missing name argument");
                    data.name =args[i];
                    break;
            case "-i":
            case "--ids":
                    i++;
                    if (i >= args.length)
                            error_exit_usage("Missing ids argument");
                    /* TODO */
                    break;
            case "-r":
            case "--region":
                    i++;
                    if (i >= args.length)
                            error_exit_usage("Missing region argument");
                    data.region = args[i];
                    break;
             }
       }
    }
    

Node JS 新手。

【问题讨论】:

  • 您使用自己的实现而不是像npmjs.com/package/nomnom 这样的现有实现是否有特定原因?
  • 你能像这样使用 100-101-103 参数吗
  • @FelixKling 目前该脚本在我的实现中使用上面提到的switch case 方法接受8 个参数,因此不想更改它。
  • @Mytri 实际上这些值是 10 位数的帐号。所以这是不可能的。
  • 但是如果你给出像 ./test.js -n name1 -i 100 101 103 -r us-east 这样的参数,每 100 101 103 将被计为不同的索引所以你能给他们 Like ./ test.js -n name1 -i "100 101 103" -r us-east 所以它会被当作一个字符串和一个索引

标签: javascript node.js command-line-arguments


【解决方案1】:

我猜你可以只看下一个参数,只要它们是 ID:

case "-i":
case "--ids":
  data.ids = [];
  while (/^\d+$/.test(args[i])) {
    data.ids.push(Number(args[i]));
    i++;
  }
  if (data.ids.length === 0) {
    error_exit_usage("Missing ids argument");
  }
  break;

【讨论】:

    【解决方案2】:

    试试这个:

    function processArguments(args) {
    
        var options = {}, optionName = null;
    
        args.forEach(function (val, index, array) {
            if (val.indexOf('-') === 0) {   
                optionName = val.replace('-', '');
                options[optionName] = [];
            } else {
                if (optionName != null) {
                    options[optionName].push(val);
                }
            }   
        });
        return options;
    }
    
    var options = processArguments(process.argv);
    
    console.log(options['n']);
    console.log(options['i']);
    console.log(options['r']);
    

    【讨论】:

    • 如果没有给出选项(即-n),那么 typeof options['n'] === 'undefined'
    【解决方案3】:

    使用commander 并将 i 选项强制转换为列表。将其作为逗号分隔值传递。见examples

    始终在 npmjs.com 或 node-modules.com 上搜索或使用 modsearch,因为有许多模块可用于此类常见场景。

    【讨论】:

      【解决方案4】:

      因此,您可以使用的一种方法是 您可以发送参数,例如 ./test.js -n name1 -i "100 101 103" -r us-east

      然后使用split function 拆分它们,这将返回数组。

      function process_args()
      {
        var args = process.argv.slice(2);
        var i;
        for (i = 0; i > args.length; i++)
        {
              switch(args[i])
              {
              case "-n":
              case "--name":
                      i++;
                      if (i >= args.length)
                              error_exit_usage("Missing name argument");
                      data.name =args[i];
                      break;
              case "-i":
              case "--ids":
                      i++;
                      if (i >= args.length)
                              error_exit_usage("Missing ids argument");
                      data.id=args[i].split(" ")
                      break;
              case "-r":
              case "--region":
                      i++;
                      if (i >= args.length)
                              error_exit_usage("Missing region argument");
                      data.region = args[i];
                      break;
               }
         }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-14
        • 2021-11-25
        • 2016-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-05
        • 1970-01-01
        相关资源
        最近更新 更多