使用nodejs的spawn会导致“未知选项 – ”和“”错误

我尝试着spawn一个rm -rf node_modules然后是npm install (在windows 7上; n x命令由一个透明安装的CygWin提供,所有n个 x命令都可以在命令行上parsing)。

我最初使用exec ,但想要捕捉stdout / stderr信息,所以我想我会使用spawn ,并重写代码使用它。 然而,这打破了一切。

rm命令改写成这样:

 var spawn = require("child_process").spawn, child = spawn("rm", ["-rf", "node_modules"]); child.stdout.on('data', function (data) { console.log(data.toString()); }); child.stderr.on('data', function (data) { console.log(data.toString()); }); child.on('error', function() { console.log(arguments); }); 

但是,运行这将产生以下错误:

 rm: unknown option -- , Try `rm --help' for more information. 

npm命令改写成这样:

 var spawn = require("child_process").spawn, child = spawn("npm", ["install"]); child.stdout.on('data', function (data) { console.log(data.toString()); }); child.stderr.on('data', function (data) { console.log(data.toString()); }); child.on('error', function() { console.log(arguments); }); 

但是,运行这将产生以下错误:

 { '0': { [Error: spawn ENOENT] code: 'ENOENT', errno: 'ENOENT', syscall: 'spawn' } } 

我如何使产卵运行相同的命令,使用exec罚款没有它抛出错误遍地? 为什么这不起作用? 阅读API, http://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options ,似乎表明这正是一个人应该怎么使用产卵…

经过大量尝试不同的事情之后,我终于看到了“npm”实际上是在窗口上,结果是一个名为npm的bash脚本,以及一个名为npm.cmd的Windows本地批处理脚本(不知道为什么它是.cmd,这应该是.bat,但是你有它)。 Windows的命令parsing器会看到npm ,注意到它不是可执行文件,请参阅npm.cmd ,然后注意这是一个可执行文件,然后用它来代替。 这在terminal中很有用,但是spawn()不会做任何这样的parsing:传递npm会使它失败,因为它不是一个可执行文件。 传递npm.cmd作为命令,但是,工作得很好。

(另外,不知道为什么rm先前失败了,因为这实际上没有任何改变,可以正确地工作,可以把它看作是问题的一部分,而事实上并非如此。

所以:如果你在Windows下运行ENOENT,当你试图触发的命令在一个简单的命令提示符下运行时,找出你所调用的命令是否是一个真正的可执行文件,或者是否有一个.bat / .cmd文件,命令提示符将“帮助”运行,而不是。 如果是的话,产卵。

编辑

由于这篇文章仍然是upvotes,确保命令始终工作的一个好方法是引导它基于process.platform ,这将是win32的Windows。

 var npm = (process.platform === "win32" ? "npm.cmd" : "npm"), child = spawn(npm, ["install", ...]); ... 

我想这可能是某种cygwin疑难杂症。 我正在运行Ubuntu 12.04,并试图复制您的问题,但它对我来说工作得很好。 总之,我没有看到你做错了什么。

如果是抱怨这个选项,可能会把它分成多个选项,如下所示:

 child = spawn("rm", ["-r", "-f", "node_modules"]); 

这是一个冰雹玛丽,但也适用于我的Ubuntu 12.04。 你可能试着删除一个文件,看看你是否得到了同样的结果。

 child = spawn("rm", ["/home/username/Desktop/TestFile"]); 

如果仍然失败,那么你知道你正在反对一些疯狂的东西。

你甚至可以尝试执行一个没有参数的命令,例如:

 child = spawn("ls"); 

如果还是失败了,你根本就不可能产卵,这将是我的猜测,并且至less有一位高pipe正在工作。

对于你来说,答案并不多,但正如我所说的,我看不出你做错了什么。

此外,我不明白你的npm命令是如何工作的,因为你没有指定要安装的东西,但是说到这里,如果我使用相同的命令,它会以不同的方式失败。 。 。 我看到很多stderr输出,不是一个总体错误。

顺便说一句,我正在运行节点v0.8.21。 您可以通过节点-v查询。 如果你正在运行另一个版本,也许给0.8.21一个尝试。

使用完整path的过程,如:

 var cmd = require('child_process').spawn("C:\\windows\\system32\\cmd.exe");