节点js:执行命令行(打开文件)

时间:2014-12-17 05:11:03

标签: node.js cmd

我正在尝试使用节点通过命令行打开文件。我正在使用child_process.spawn,这是代码

var process = require('child_process');

var cmd = process.spawn('cmd', ['start','tmp.txt'], {cwd: 'C:\\Users\\testuser\\Node_dev'});

我希望打开位于Node_dev文件夹中的文件tmp.txt但是我收到错误 - dir error {[错误:产生ENOENT]代码:' ENONENT',错误:' ENOENT',系统调用:' spawn

我缺少什么?

对于这个问题,还有child_process.spawn和child_process.exec之间的区别吗?

3 个答案:

答案 0 :(得分:4)

我没有解释您的ENOENT错误[更新:原来这是一个红色的鲱鱼],但您的命令的一个问题是您启动{{1没有cmd.exe,意味着生成的shell将(a)保持打开状态,(b)实际上忽略指定的命令。

至于/c模块的方法有何不同:

child_process.execFile采用回调报告单一缓冲结果,而.exec提供 chunked通过事件输出
只有.spawn将命令传递给平台的默认shell ,这样会更方便,但效率更低。

在您的情况下,您不关心从spawned命令返回的输出,并且因为您无论如何都需要涉及shell,.exec是最佳选择。

在Windows上,.exec的使用带来了它自己的陷阱:

  • 它不是可执行文件,而是内置的shell(以Unix术语表示) - 因此,必须通过start调用它。
  • 如果第一个参数是带有嵌入空格的[双引号]值,则将其解释为窗口标题而不是文件名参数;因此,要强健地传递文件名参数,必须传递一个空窗口标题作为第一个参数。

以下是适用于Windows的调用 - 请注意,以异步方式启动子进程忽略其中的任何输出 - 他们所做的就是告诉{{1打开指定的文件,就像用户在资源管理器中打开它一样:

  • 使用cmd.exe
cmd.exe
  • 使用.execvar cpm = require('child_process'); // With .exec, specify the entire shell command as the 1st argument - it is implicitly // passed to cmd.exe. // '""' as the 1st argument to `start` is an empty window title that ensures that any // filename argument with embedded spaces isn't mistaken for a window title. cpm.exec('start "" "tmp.txt"', {cwd: 'C:\\Users\\testuser\\Node_dev'});
.execFile

答案 1 :(得分:2)

npm上有一个名为open的跨平台模块,它使用操作系统的默认处理程序打开文件,您可以使用as a guide或只是按原样使用它。

要在Windows上使用spawn手动执行此操作,您可以执行以下操作:

var args = ['/s', '/c', 'start', '', 'tmp.txt'],
    opts = { cwd: 'C:\\Users\\testuser\\Node_dev' },
    child = child_process.spawn('cmd.exe', args, opts);

child_process.exec()基本上是child_process.spawn()的更高级别的包装器,它缓冲输出,然后将缓冲的stdout和stderr输出传递给回调。

答案 2 :(得分:0)

我正在使用相同的,这是我的命令,可以使用参数运行和可执行:

var exec = require('child_process').spawn;
let scanProcess = exec('cmd', [ '/c', 'start', '""', 'feature.exe --version' ], {cwd: 'command_folder'});

我正在运行 Windows 操作系统的容器中的 Azure DevOps 上运行它。 上面的命令没有回来,它挂了。任何指针。