溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Electron —— 執行DOS命令有亂碼

發布時間:2020-09-10 10:20:16 來源:網絡 閱讀:2237 作者:tywali 欄目:web開發

現象

使用exec()執行DOS命令dir,結果出現亂碼:
Electron —— 執行DOS命令有亂碼

分析

代碼如下:

$(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命令有亂碼

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女