const { spawn } = require('child_process');
const child = spawn('ls', ['-lh', '/usr']);
// use child.stdout.setEncoding('utf8'); if you want text chunks
child.stdout.on('data', (chunk) => {
// data from standard output is here as buffers
});
// since these are streams, you can pipe them elsewhere
child.stderr.pipe(dest);
child.on('close', (code) => {
console.log(`child process exited with code ${code}`);
});
const { execSync } = require('child_process');
// stderr is sent to stdout of parent process
// you can set options.stdio if you want it to go elsewhere
let stdout = execSync('ls');
var spawn = require('child_process').spawn;
var child = spawn('prince', [
'-v', 'builds/pdf/book.html',
'-o', 'builds/pdf/book.pdf'
]);
child.stdout.on('data', function(chunk) {
// output will be here in chunks
});
// or if you want to send output elsewhere
child.stdout.pipe(dest);
9 回答
对于更新版本的Node.js(v8.1.4),事件和调用与旧版本类似或相同,但鼓励使用标准的新语言功能 . 例子:
对于缓冲的非流格式化输出(您可以一次性获取),请使用child_process.exec:
您也可以将它与Promises一起使用:
如果您希望以块的形式逐渐接收数据(以流形式输出),请使用child_process.spawn:
这两个功能都具有同步功能 . child_process.execSync的示例:
以及child_process.spawnSync:
Note: 以下代码仍然有效,但主要针对ES5及之前的用户 .
documentation(v5.0.0)中详细记录了使用Node.js生成子进程的模块 . 要执行命令并将其完整输出作为缓冲区获取,请使用child_process.exec:
如果需要对流使用句柄处理I / O,例如当您需要大量输出时,请使用child_process.spawn:
如果您正在执行文件而不是命令,则可能需要使用child_process.execFile,这些参数几乎与
spawn
相同,但具有第四个回调参数,如exec
,用于检索输出缓冲区 . 这可能看起来像这样:从v0.11.12开始,Node现在支持同步
spawn
和exec
. 上述所有方法都是异步的,并且具有同步对应物 . 他们的文档可以在here找到 . 虽然它们对脚本很有用,但请注意,与用于异步生成子进程的方法不同,同步方法不返回ChildProcess的实例 .Node JS v10.9.0,LTS v8.11.4和v6.14.3 --- 2018年8月
Async and proper method:
Sync:
从Node.js v10.9.0 Documentation
Node.js v8.11.4 Documentation和Node.js v6.14.3 Documentation也是如此
您正在寻找child_process.exec
这是一个例子:
我刚刚写了一个Cli助手来轻松处理Unix / windows .
Javascript:
Typescript original source file:
如果你想要的东西非常类似于top answer但也是同步的,那么这将有效 .
从版本4开始,最接近的替代方法是
child_process.execSync
方法:请注意,此方法会阻止事件循环 .
如果你不介意依赖并想使用promises,child-process-promise有效:
installation
exec Usage
spawn usage
@ hexacyanide的答案几乎是完整的 . 在Windows上命令
prince
可能是prince.exe
,1344028,prince.bat
或只是prince
(我不知道如何捆绑宝石,但是npm分箱带有sh脚本和批处理脚本 -npm
和npm.cmd
) . 如果你想编写一个可在Unix和Windows上运行的可移植脚本,你必须生成正确的可执行文件 .这是一个简单但可移植的spawn函数: