命令行索引
Command Line Index
我正在通过命令行发送以下文本,但不确定如何提取 -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);
}
}
不同的是,如果您不只有一种类型的文件扩展名,您可以对您已经猜测的内容应用更接近的解决方案,假设文件名是 always 包含在 -q
和 -v
标志中:
let fIdx = process.argv.indexOf('-q');
let vIdx = process.argv.indexOf('-v');
for (i of process.argv.slice(fIdx+1,vIdx)) {
//i is your filename now, do something with it
console.log(i)
}
我正在通过命令行发送以下文本,但不确定如何提取 -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);
}
}
不同的是,如果您不只有一种类型的文件扩展名,您可以对您已经猜测的内容应用更接近的解决方案,假设文件名是 always 包含在 -q
和 -v
标志中:
let fIdx = process.argv.indexOf('-q');
let vIdx = process.argv.indexOf('-v');
for (i of process.argv.slice(fIdx+1,vIdx)) {
//i is your filename now, do something with it
console.log(i)
}