问题描述
我正在通过命令行发送以下文本,但不确定如何提取 -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