温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Electron —— 执行DOS命令有乱码

发布时间:2020-09-10 10:20:16 来源:网络 阅读:2166 作者: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