命令行索引

问题描述

我正在通过命令行发送以下文本,但不确定如何提取 -q 标记中的不同名称 命令: -s 127.0.0.1:3000 -q test1.pdf test2.pdf test3.pdf test4.pdf-v 7

发送的文件数量可以改变

这是我目前的解析方式
var s = process.argv.indexOf('-s') + 1;let files = process.argv.indexOf('-q') + 1; let version = process.argv.indexOf('-v') + 1;

let fileName = process.argv[files ].split(' ')

对尝试什么有什么建议吗?

解决方法

通常对于命令行参数,如果每个 test*.pdf 文件都应该属于 -q 选项,我希望看到它们被列为:

-q "test1.pdf,test2.pdf,test3.pdf,test4.pdf"

-q test1.pdf -q test2.pdf -q test3.pdf -q test4.pdf

除了成为更传统的样式之外,这两种样式都将使逻辑更容易解析。

另外,我建议您查看 yargs module (https://yargs.js.org/) 以解析参数。

更新: 如果输入无法更改,那么我建议遍历 args 列表,如果它以“-”字符开头,请记住该选项并继续将所有连续选项收集到该数组中,直到到达另一个标志。

一些粗略的代码:

const opts = {}; // Hold all options
const optionPattern = /^(?<Prefix>-{1,2}|\/)(?<Flag>.*)/; // Support various styles: -s,--s,/s
let currFlag = 'Unknown'; // Bucket to hold any args not specifically marked

for (const elem of process.argv) {
    const matchResult = optionPattern.exec(elem);
    if (matchResult) {
        currFlag = matchResult.groups.Flag;
    } else {
        opts[currFlag] = opts[currFlag] || []; // Create the array if this is the first one
        opts[currFlag].push(elem);
    }
}

console.log(`Options Received: ${JSON.stringify(opts,null,4)}`);

上面会输出:

Options Received: {
"Unknown": [
    "C:\\Program Files\\nodejs\\node.exe","C:\\Projects\\NodeTestScripting\\TestScripts\\CommandLineArgs.js"
],"s": [
    "127.0.0.1:3000"
],"q": [
    "test1.pdf","test2.pdf","test3.pdf","test4.pdf"
],"v": [
    "7"
]

}

,

您可以实现这种不同的基本解决方案,遍历参数并选择其中包含“.pdf”的参数。

for (i of process.argv) {
    if (i.includes(".pdf")) {
        //i is your filename now,do something with it
        console.log(i);
    }
}

不同的是,如果您不只有一种类型的文件扩展名,您可以对您已经猜测的内容应用更接近的解决方案,假设文件名总是包含在 { {1}} 和 -q 标志:

-v