我将通过cli向自定义节点脚本传递一个可选参数,如下所示:
$ node myscript.js --sizes 10,20,30
myscript.js使用process.argv捕获--sizes列表,如下所示:
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,这就是在通过以下方式运行命令(最初显示的命令)时正确发生的情况:
问题
在Windows console.log(sizeArgs)上通过PowerShell运行同一命令时,仅打印10。
很明显,字符串10,20,30中的逗号在某种程度上被解释为另一个参数,正如下面的测试所揭示的那样:
// 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问题,也可能不解决),但是,我正在尝试在这个阶段避免额外的依赖性。
通过确保--sizes值10,20,30放在双引号中解决了这个问题。
正如这个答案中所建议的。
因此,向node传递包含逗号的参数的跨平台方法如下:
$ node myscript.js --sizes"10,20,30"
复试
现在,原始问题中使用的测试在所有测试平台/环境中打印如下:
...
2: --sizes
3: 10,20,30
webdriver.io 如果不同平台的设置可以在wdio.conf下加入
npm run local -- --platform web
如果这时候参数有多个,这边则以数组的形式去执行
specs: process.argv.indexOf('--platform') != -1 ? [`./tests/features/${process.argv[process.argv.indexOf('--platform') + 1]}/**/*.feature`] : ['./tests/**/*.feature'], // Patterns to exclude.