我正在尝试使用节点通过命令行打开文件。我正在使用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之间的区别吗?
答案 0 :(得分:4)
我没有解释您的ENOENT
错误[更新:原来这是一个红色的鲱鱼],但您的命令的一个问题是您启动{{1没有cmd.exe
,意味着生成的shell将(a)保持打开状态,(b)实际上忽略指定的命令。
至于/c
模块的方法有何不同:
child_process
和.execFile
采用回调报告单一缓冲结果,而.exec
提供 chunked通过事件输出。
只有.spawn
将命令传递给平台的默认shell ,这样会更方便,但效率更低。
在您的情况下,您不关心从spawned命令返回的输出,并且因为您无论如何都需要涉及shell,.exec
是最佳选择。
在Windows上,.exec
的使用带来了它自己的陷阱:
start
调用它。以下是适用于Windows的调用 - 请注意,以异步方式启动子进程并忽略其中的任何输出 - 他们所做的就是告诉{{1打开指定的文件,就像用户在资源管理器中打开它一样:
cmd.exe
:cmd.exe
.exec
或var 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 上运行它。 上面的命令没有回来,它挂了。任何指针。