rad*_*ead 8 child-process node.js
我想使用 nodejs 在命令提示符中运行命令。
基于https://dzone.com/articles/understanding-execfile-spawn-exec-and-fork-in-node,我用
child_process.execFile('protractor', ['./src/convertedJs/tempProtractorconfig.js'], (err, stdout, stderr) => {}
Run Code Online (Sandbox Code Playgroud)
上面的代码抛出一个 ENOENT 错误。
但是当我跑
child_process.exec('protractor ./src/convertedJs/tempProtractorconfig.js', (err,stdout,stderr) => {}`
Run Code Online (Sandbox Code Playgroud)
一切正常。
有人可以解释发生了什么吗?
使用 child_process.exec() 和 child_process.execFile() 之间的区别在于后者不会产生外壳,而前者会。
Nodejs文档指出:
但是,在 Windows 上,.bat 和 .cmd 文件在没有终端的情况下无法单独执行,因此无法使用 child_process.execFile() 启动。在 Windows 上运行时,可以使用带有 shell 选项集的 child_process.spawn() 调用 .bat 和 .cmd 文件、使用 child_process.exec() 或通过生成 cmd.exe 并将 .bat 或 .cmd 文件作为参数(这是 shell 选项和 child_process.exec() 所做的)。
我可以启动它们...虽然不是没有问题。
我的观察:
child_process.execFile('ls', ...)在 Linux 上运行以下工作,而child_process.execFile('dir', ...)在 Windows 上不工作。child_process.execFile('C:\\Users\\Jperl\\AppData\\Roaming\\npm\\protractor.cmd', ...)按预期工作!没有外壳意味着我们无权访问路径变量。根本不要在 Windows 上使用 execFile。而是使用spawn或exec:
var protractor = child_process.spawn('protractor', ['./src/convertedJs/tempProtractorconfig.js'], {shell: true});
Run Code Online (Sandbox Code Playgroud)
或者
var protractor = child_process.spawn('cmd', ['/c', 'protractor', './src/convertedJs/tempProtractorconfig.js']);
Run Code Online (Sandbox Code Playgroud)
在nodejs v9.5.0中,exec 在文件lib/child_process.js中定义如下
exports.exec = function(command /*, options, callback*/) {
var opts = normalizeExecArgs.apply(null, arguments);
return exports.execFile(opts.file, opts.options, opts.callback);
};
Run Code Online (Sandbox Code Playgroud)
这意味着,最终exec调用执行你的命令,所以在你的情况下,失败但不是execFile很奇怪execFileexec
| 归档时间: |
|
| 查看次数: |
7862 次 |
| 最近记录: |