Electron —— 执行DOS命令有乱码

现象

使用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()函数完成转码;
 
执行效果如下:

原文地址:http://blog.51cto.com/lancelot/2314247

时间: 2024-08-06 01:10:31

Electron —— 执行DOS命令有乱码的相关文章

C#执行DOS命令(CMD命令)

在c#程序中,有时会用到调用cmd命令完成一些功能,于是在网上查到了如下方法,实现了c#执行DOS命令,并返回结果.         //dosCommand Dos命令语句         public string Execute(string dosCommand)         {             return Execute(dosCommand, 10);         }         /// <summary>         /// 执行DOS命令,返回DOS命

在.net中悄悄执行dos命令,并获取执行的结果(转)

一.怎样使dos命令悄悄执行,而不弹出控制台窗口? 1.需要执行带“/C”参数的“cmd.exe”命令,它表示执行完命令后立即退出控制台.2.设置startInfo.UseShellExecute = false;     //不使用系统外壳程序启动进程3.设置startInfo.CreateNoWindow = true;     //不创建窗口 二.怎样得到dos命令的执行结果? 1.设置startInfo.RedirectStandardOutput = true;   //重定向输出,而

c# 设置和取消文件夹共享及执行Dos命令

/// <summary> /// 设置文件夹共享 /// </summary> /// <param name="FolderPath">文件夹路径</param> /// <param name="ShareName">共享名</param> /// <param name="Description">共享注释</param> /// <re

c#执行Dos命令

效果图: 具体实现在代码中有详细的注释,请看代码. 实现执行CMD命令的核心代码(Cmd.cs): [csharp] using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Diagnostics; using System.Threading; using System.Management; using System.Globalization; na

Delphi执行DOS命令显示到文本框

Delphi执行DOS命令显示到文本框(TMemo) 2007-11-24 22:03 procedure CmdExecAndView(FileName: string; memo: TMemo); procedure _AddInfo(mmInfo:TMemo; S: string; var line: string); var i, p: Integer; begin if mmInfo.Lines.Count > 800 then mmInfo.Lines.Clear; //去掉 \r

appium自动化测试框架——在python脚本中执行dos命令

一般我们运行dos命令,会有两种需求,一种是需要收集执行结果,如ip.device等:一种是不需要收集结果,如杀死或开启某个服务. 对应的在python中就要封装两种方法,来分别实现这两种需求. 1.引入包 import os 2.只执行不收集结果 os.system(command) 3.执行并手机结果 os.popen(command).readlines() 4.代码实现 1 #coding=utf-8 2 import os 3 4 class DosCmd: 5 ''' 6 用来封装w

[源码]perl执行dos命令 执行cmd命令并输出cgi页面

perl执行dos命令 执行cmd命令并输出cgi页面 2014-08-31 01:30:13| 分类: Perl |举报 |字号 订阅 #!c:/Perl/bin/perl.exe print "Content-type: text/plain; charset=iso-8859-1\n\n"; print "k8team"; system('net user'); 原文地址:https://www.cnblogs.com/k8gege/p/10585702.ht

C# 执行DOS命令和批处理

在项目开发中,有时候要处理一些文件,比如视频格式的转换,如果用C开发一套算法,再用C#调用,未免得不偿失!有时候调用现有的程序反而更加方便.今天就来说一下C#中如何调用外部程序,执行一些特殊任务. 这里演示调用cmd.exe,即我们常用的DOS. 下面来看代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Diagnostics; namesp

在c++程序中执行DOS命令

转自博客:http://blog.csdn.net/ypist/article/details/8485049 #1,system()方式 在C盘根目录下新建文件夹,名称为12: system("md c://12"); 执行时命令窗口会闪一下,看不到执行结果: dos 自身提供了执行多条命令的功能,符号 && 代表同时执行多条命令. 如先切换到C下的12文件夹,然后执行dir命令:cd C:/12 && dir 暂停三秒后继续程序:ping -w 30