{ const exec = require( child_process ).exec; // 任何你..."/>
您好,登錄后才能下訂單哦!
使用exec()執(zhí)行DOS命令dir,結(jié)果出現(xiàn)亂碼:
代碼如下:
$(document).ready(() => {
const exec = require('child_process').exec;
// 任何你期望執(zhí)行的cmd命令,ls都可以
let cmdStr = 'dir';
// 執(zhí)行cmd命令的目錄,如果使用cd xx && 上面的命令,這種將會無法正常退出子進(jìn)程
let cmdPath = './';
// 子進(jìn)程名稱
let workerProcess;
var arr = [];
function runExec() {
// 執(zhí)行命令行,如果命令不需要路徑,或就是項目根目錄,則不需要cwd參數(shù):
workerProcess = exec(cmdStr, {cwd: cmdPath});
// 打印正常的后臺可執(zhí)行程序輸出
workerProcess.stdout.on('data', function (data) {
arr.push(data);
console.log(data);
});
// 打印錯誤的后臺可執(zhí)行程序輸出
workerProcess.stderr.on('data', function (data) {
console.log('stderr: ' + data);
});
// 退出之后的輸出
workerProcess.on('close', function (code) {
console.log(arr);
console.log('out code:' + code);
});
}
$('#exec_cmd').click((e) => {
runExec();
});
網(wǎng)上找了一下,普遍說是在windows的DOS窗口下,使用的是GBK字符集,而JS默認(rèn)是UTF-8,所以會導(dǎo)致亂碼。
使用iconv-lite庫實(shí)現(xiàn)解碼,代碼如下:
$(document).ready(() => {
const exec = require('child_process').exec;
// 任何你期望執(zhí)行的cmd命令,ls都可以
let cmdStr = 'dir';
// 執(zhí)行cmd命令的目錄,如果使用cd xx && 上面的命令,這種將會無法正常退出子進(jìn)程
let cmdPath = './';
// 子進(jìn)程名稱
let workerProcess;
var arr = [];
function runExec() {
let iconv = require('iconv-lite');
// 執(zhí)行命令行,如果命令不需要路徑,或就是項目根目錄,則不需要cwd參數(shù):
workerProcess = exec(cmdStr, {cwd: cmdPath, encoding:'GBK'});
// 打印正常的后臺可執(zhí)行程序輸出
workerProcess.stdout.on('data', function (data) {
arr.push(data);
console.log(data);
});
// 打印錯誤的后臺可執(zhí)行程序輸出
workerProcess.stderr.on('data', function (data) {
console.log('stderr: ' + data);
});
// 退出之后的輸出
workerProcess.on('close', function (code) {
console.log(iconv.decode(Buffer.concat(arr), 'GBK'));
console.log('out code:' + code);
});
}
$('#exec_cmd').click((e) => {
runExec();
});
代碼說明:
1、 首先要引入iconv-lite庫,如果沒安裝,則使用“npm install iconv-lite”命令安裝;
2、 為exec函數(shù)指定encodeing參數(shù)為GBK;
3、 在workerProgress的close事件中,首先用Buffer.concat()將得到的執(zhí)行結(jié)果合并到一個二進(jìn)制數(shù)組里,然后用iconv.decode()函數(shù)完成轉(zhuǎn)碼;
執(zhí)行效果如下:
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。