exec vs execFile nodeJs

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)

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

jpe*_*erl 9

使用 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 上不工作。
  • 在 Windows 上指定量角器可执行文件的完整路径,例如child_process.execFile('C:\\Users\\Jperl\\AppData\\Roaming\\npm\\protractor.cmd', ...)按预期工作!没有外壳意味着我们无权访问路径变量

根本不要在 Windows 上使用 execFile。而是使用spawnexec

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)


Chr*_*ang 2

在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