Node.js执行系统命令
原文發(fā)表在我的博客 Node.js 執(zhí)行系統(tǒng)命令 | 以太空間
??我們?cè)谑褂肗ode.js的時(shí)候總有一些時(shí)候需要執(zhí)行一些系統(tǒng)命令,與系統(tǒng)做一些交互,或者調(diào)用其他語(yǔ)言,這個(gè)時(shí)候該怎么做呢? ??當(dāng)然是使用child_process模塊了,這個(gè)模塊翻譯過(guò)來(lái)就是子進(jìn)程,當(dāng)然正如其名,這個(gè)模塊主要是通過(guò)產(chǎn)生子進(jìn)程來(lái)發(fā)揮作用,下面我們就用實(shí)例來(lái)看一下。
一、exec與execSync
??這是child_process模塊里面最簡(jiǎn)單的函數(shù),作用就是執(zhí)行一個(gè)固定的系統(tǒng)命令
const { exec } = require('child_process'); // 輸出當(dāng)前目錄(不一定是代碼所在的目錄)下的文件和文件夾 exec('ls -l', (err, stdout, stderr) => {if(err) {console.log(err);return;}console.log(`stdout: ${stdout}`);console.log(`stderr: ${stderr}`); }) 復(fù)制代碼??exec函數(shù)第一個(gè)參數(shù)是要執(zhí)行的命令,的第二個(gè)函數(shù)是配置選項(xiàng),第三個(gè)參數(shù)是回調(diào)函數(shù),第二個(gè)參數(shù)中一個(gè)比較常用的就是子進(jìn)程的工作目錄
const { exec } = require('child_process'); const path = require('path'): // 在當(dāng)前目錄下的scripts文件夾里執(zhí)行hexo g命令 exec('hexo g', { cwd: path.join(process.cwd(), 'scripts') }, (err, stdout, stderr) => {if(err) {console.log(err);return;}console.log(`stdout: ${stdout}`); }); 復(fù)制代碼??execSync是exec的同步版本,不過(guò)無(wú)論是execSync還是exec,得到的結(jié)果都是字符串或者Buffer對(duì)象,一般需要進(jìn)一步處理。
請(qǐng)參考:exec具體配置,execSync具體配置
二、execFile與execFileSync
??這兩個(gè)函數(shù)的作用是執(zhí)行一個(gè)可執(zhí)行文件,看下面的實(shí)例:
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); 復(fù)制代碼??跟exec類似,第一個(gè)參數(shù)是要執(zhí)行的文件路徑,第二個(gè)是參數(shù)數(shù)組,第三個(gè)是配置,第四個(gè)是回調(diào)函數(shù),當(dāng)然,除了第一個(gè)之外都是可以省略的
注意:被執(zhí)行的文件一定要有可執(zhí)行權(quán)限,如果是類似.py類的特定語(yǔ)言的腳本,一定在開(kāi)頭指定解釋器程序路徑
請(qǐng)參考:execFile配置,execFileSync配置
三、spawn與spawnSync
??child_process模塊中所有函數(shù)都是基于spawn和spawnSync函數(shù)的來(lái)實(shí)現(xiàn)的,換句話來(lái)說(shuō),spawn和spawnSync函數(shù)的配置是最完全的,其它函數(shù)都是對(duì)其做了封裝和修改。下面我們來(lái)重點(diǎn)講解一下: ??spawn函數(shù)原型是這樣的:child_process.spawn(command[, args][, options])
??它使用指定的命令行參數(shù)創(chuàng)建新進(jìn)程,spawn 會(huì)返回一個(gè)帶有stdout和stderr流的對(duì)象。你可以通過(guò)stdout流來(lái)讀取子進(jìn)程返回給Node.js的數(shù)據(jù)。stdout擁有'data','end'以及一般流所具有的事件。當(dāng)你想要子進(jìn)程返回大量數(shù)據(jù)給Node時(shí),比如說(shuō)圖像處理,讀取二進(jìn)制數(shù)據(jù)等等,你最好使用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);}}); }); 復(fù)制代碼總結(jié)
以上是生活随笔為你收集整理的Node.js执行系统命令的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 前华为技术大牛告诉你:如何正确入门深度学
- 下一篇: windows系统tomcat日志输出至