Node.js执行系统命令

原文发表在个人博客 Node.js 执行系统命令 | 以太空间html

  咱们在使用Node.js的时候总有一些时候须要执行一些系统命令,与系统作一些交互,或者调用其余语言,这个时候该怎么作呢?   固然是使用child_process模块了,这个模块翻译过来就是子进程,固然正如其名,这个模块主要是经过产生子进程来发挥做用,下面咱们就用实例来看一下。node

1、execexecSync

  这是child_process模块里面最简单的函数,做用就是执行一个固定的系统命令api

const { exec } = require('child_process');
// 输出当前目录(不必定是代码所在的目录)下的文件和文件夹
exec('ls -l', (err, stdout, stderr) => {
    if(err) {
        console.log(err);
        return;
    }
    console.log(`stdout: ${stdout}`);
    console.log(`stderr: ${stderr}`);
})
复制代码

  exec函数第一个参数是要执行的命令,的第二个函数是配置选项,第三个参数是回调函数,第二个参数中一个比较经常使用的就是子进程的工做目录数组

const { exec } = require('child_process');
const path = require('path'):
// 在当前目录下的scripts文件夹里执行hexo g命令
exec('hexo g', { cwd: path.join(process.cwd(), 'scripts') }, (err, stdout, stderr) => {
    if(err) {
        console.log(err);
        return;
    }
    console.log(`stdout: ${stdout}`);
});
复制代码

  execSyncexec的同步版本,不过不管是execSync仍是exec,获得的结果都是字符串或者Buffer对象,通常须要进一步处理。hexo

请参考:exec具体配置execSync具体配置函数

2、execFileexecFileSync

  这两个函数的做用是执行一个可执行文件,看下面的实例:ui

const { execFile, execFileSync } = require('child_process');

execFile('example.py', [], (err, stdout, stderr) => {
    if(err) {
        console.log(err);
        return;
    }
    console.log(`stdout: ${stdout}`);
});

const stdout = execFileSync('node', ['-v']);
console.log(stdout);
复制代码

  跟exec相似,第一个参数是要执行的文件路径,第二个是参数数组,第三个是配置,第四个是回调函数,固然,除了第一个以外都是能够省略的spa

注意:被执行的文件必定要有可执行权限,若是是相似.py类的特定语言的脚本,必定在开头指定解释器程序路径命令行

请参考:execFile配置execFileSync配置翻译

3、spawnspawnSync

  child_process模块中全部函数都是基于spawnspawnSync函数的来实现的,换句话来讲,spawnspawnSync函数的配置是最彻底的,其它函数都是对其作了封装和修改。下面咱们来重点讲解一下:   spawn函数原型是这样的:child_process.spawn(command[, args][, options])

  它使用指定的命令行参数建立新进程,spawn 会返回一个带有stdout和stderr流的对象。你能够经过stdout流来读取子进程返回给Node.js的数据。stdout拥有'data','end'以及通常流所具备的事件。当你想要子进程返回大量数据给Node时,好比说图像处理,读取二进制数据等等,你最好使用spawn方法

const {spawn}  = require('child_process');
const fs = require('fs');
const spawnObj = spawn('ping', ['127.0.0.1'], {encoding: 'utf-8'});
spawnObj.stdout.on('data', function(chunk) {
    console.log(chunk.toString());
});
spawnObj.stderr.on('data', (data) => {
  console.log(data);
});
spawnObj.on('close', function(code) {
    console.log('close code : ' + code);
})
spawnObj.on('exit', (code) => {
    console.log('exit code : ' + code);
    fs.close(fd, function(err) {
        if(err) {
            console.error(err);
        }
    });
});
复制代码
相关文章
相关标签/搜索