exec vs execFile nodeJs



我想使用nodejs在命令prompt中运行一个命令。
基于https://dzone.com/articles/understanding-execfile-spawn-exec-and-fork-in-node,我使用了

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

以上代码引发了一个令人难以置信的错误。
但是当我运行

child_process.exec('protractor ./src/convertedJs/tempProtractorconfig.js', (err,stdout,stderr) => {}`

一切正常。
有人可以解释发生了什么吗?

使用child_process.exec()和child_process.execfile()是有区别的,因为后者不会产生外壳,而前者则不会产生。

nodejs文档状态:

但是,在Windows上,BAT和.cmd文件在没有终端的情况下无法独立执行,因此无法使用child_process.execfile()启动。在Windows上运行时,可以使用Child_process.spawn()使用shell选项设置,使用child_process.exec()或传递cmd.exe并将.bat或.cmd文件作为一个.bat或.cmd文件作为一个。参数(这是shell选项和child_process.exec()do)。

我可以启动它们...尽管不是没有问题。

我的观察:

  • 运行以下child_process.execFile('ls', ...)在Linux上工作,而child_process.execFile('dir', ...)在Windows上不起作用。
  • 指定窗口上量角器可执行文件的完整路径,例如child_process.execFile('C:\Users\Jperl\AppData\Roaming\npm\protractor.cmd', ...)按预期工作!没有外壳意味着我们无法访问路径变量

根本不要将execfile用于Windows。而是使用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']);

在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不是

很奇怪

我还面临着一些问题来通过使用" node myfile.js"来启动节点进程,但是当我添加node.exe的位置时,例如node.exe/exe的路径。node.exe myfile.js'它的工作正常,就像我预期

最新更新