Electron —— 執行DOS命令有亂碼
阿新 • • 發佈:2018-11-08
結果 完成 lec out http fff function 輸出 col 現象
使用exec()執行DOS命令dir,結果出現亂碼:
分析
代碼如下:
$(document).ready(() => { const exec = require(‘child_process‘).exec; // 任何你期望執行的cmd命令,ls都可以 let cmdStr = ‘dir‘; // 執行cmd命令的目錄,如果使用cd xx && 上面的命令,這種將會無法正常退出子進程 let cmdPath = ‘./‘; // 子進程名稱 let workerProcess; var arr = []; function runExec() { // 執行命令行,如果命令不需要路徑,或就是項目根目錄,則不需要cwd參數: workerProcess = exec(cmdStr, {cwd: cmdPath}); // 打印正常的後臺可執行程序輸出 workerProcess.stdout.on(‘data‘, function (data) { arr.push(data); console.log(data); }); // 打印錯誤的後臺可執行程序輸出 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(); });
網上找了一下,普遍說是在windows的DOS窗口下,使用的是GBK字符集,而JS默認是UTF-8,所以會導致亂碼。
解決
使用iconv-lite庫實現解碼,代碼如下:
$(document).ready(() => { const exec = require(‘child_process‘).exec; // 任何你期望執行的cmd命令,ls都可以 let cmdStr = ‘dir‘; // 執行cmd命令的目錄,如果使用cd xx && 上面的命令,這種將會無法正常退出子進程 let cmdPath = ‘./‘; // 子進程名稱 let workerProcess; var arr = []; function runExec() { let iconv = require(‘iconv-lite‘); // 執行命令行,如果命令不需要路徑,或就是項目根目錄,則不需要cwd參數: workerProcess = exec(cmdStr, {cwd: cmdPath, encoding:‘GBK‘}); // 打印正常的後臺可執行程序輸出 workerProcess.stdout.on(‘data‘, function (data) { arr.push(data); console.log(data); }); // 打印錯誤的後臺可執行程序輸出 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函數指定encodeing參數為GBK;
3、 在workerProgress的close事件中,首先用Buffer.concat()將得到的執行結果合並到一個二進制數組裏,然後用iconv.decode()函數完成轉碼;
執行效果如下:
Electron —— 執行DOS命令有亂碼