关于node.js:使用不同的CLI将命令行参数传递给节点Cross Platform

Passing command line arguments to node Cross Platform using different CLI

我将通过cli向自定义节点脚本传递一个可选参数,如下所示:

$ node myscript.js --sizes 10,20,30

myscript.js使用process.argv捕获--sizes列表,如下所示:

1
2
3
4
5
6
7
if (process.argv.indexOf('--sizes') !== -1) {
    var sizeArgs = process.argv[process.argv.indexOf('--sizes') + 1];
    console.log(sizeArgs); //--> 10,20,30
    // ...
    // using sizeArgs.split(',') later to create an array: ['10','20','30']
    // plus some other logic to validate values are numbers etc etc.
}

期望的结果是,console.log打印字符串10,20,30,这就是在通过以下方式运行命令(最初显示的命令)时正确发生的情况:

  • Mac OS-使用终端或ITerm
  • Mac OSX-使用终端或ITerm
  • Windows-使用命令提示(cmd.exe)

问题

在Windows console.log(sizeArgs)上通过PowerShell运行同一命令时,仅打印10

很明显,字符串10,20,30中的逗号在某种程度上被解释为另一个参数,正如下面的测试所揭示的那样:

1
2
3
4
// print process.argv
process.argv.forEach(function (val, index, array) {
    console.log(index + ': ' + val);
});

PowerShell打印:

...

2: --sizes

3: 10

4: 20

5: 30

对于满足所需结果的环境,打印如下:

...

2: --sizes

3: 10,20,30

帮助

考虑到PowerShell中的怪癖,如何跨平台实现这一点。最终我需要获得一个大小数组。

我之所以选择使用逗号[,作为--sizes字符串的分隔符,是因为还可以提供另一个可选参数(--outdir接受文件路径作为字符串)。

注意:我知道有几个包解决方案yarg、args等(这可能解决PowerShell问题,也可能不解决),但是,我正在尝试在这个阶段避免额外的依赖性。


通过确保--sizes10,20,30放在双引号中解决了这个问题。

正如这个答案中所建议的。

因此,向node传递包含逗号的参数的跨平台方法如下:

$ node myscript.js --sizes"10,20,30"

复试

现在,原始问题中使用的测试在所有测试平台/环境中打印如下:

...

2: --sizes

3: 10,20,30