我想使用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) => {}`

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

最佳答案

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

Node.js documentation指出:



我可以启动它们……尽管并非没有问题。

我的观察:

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

  • 根本不要在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']);
    

    10-06 11:54