exec vs execFile nodeJs

时间:2017-09-27 10:42:00

标签: node.js child-process

我想使用nodejs在命令提示符下运行命令 基于https://dzone.com/articles/understanding-execfile-spawn-exec-and-fork-in-node,我使用了

child_process.execFile('protractor', ['./src/convertedJs/tempProtractorconfig.js'], (err, stdout, stderr) => {}

以上代码会引发ENOENT错误 但是当我跑步时

child_process.exec('protractor ./src/convertedJs/tempProtractorconfig.js', (err,stdout,stderr) => {}`
一切正常。
有人能解释一下发生了什么吗?

2 个答案:

答案 0 :(得分:3)

使用child_process.exec()和child_process.execFile()之间的区别在于,后者不会产生外壳,而前者会产生外壳。

Nodejs documentation指出:

  

但是,在Windows上,.bat和.cmd文件在没有终端的情况下无法单独执行,因此无法使用child_process.execFile()启动。在Windows上运行时,可以使用设置了shell选项的child_process.spawn(),child_process.exec()或通过生成cmd.exe并将.bat或.cmd文件作为参数(这是shell选项和child_process.exec()的作用)。

我可以启动它们……虽然不是没有问题。

我的观察:

  • 运行以下child_process.execFile('ls', ...)可以在Linux上运行,而child_process.execFile('dir', ...)不能在Windows上运行。
  • 指定Windows上量角器可执行文件的完整路径,例如child_process.execFile('C:\\Users\\Jperl\\AppData\\Roaming\\npm\\protractor.cmd', ...)可以正常工作! 没有shell意味着我们无权访问path变量

根本不为Windows使用execFile。而是使用spawnexec

var protractor = child_process.spawn('protractor', ['./src/convertedJs/tempProtractorconfig.js'], {shell: true});

var protractor = child_process.spawn('cmd', ['/c', 'protractor', './src/convertedJs/tempProtractorconfig.js']);

答案 1 :(得分:0)

在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);

};

这意味着,最后exec调用execFile来执行您的命令,所以在您的情况下,execFile失败但exec不是

,这很奇怪