使用exec()执行DOS命令dir,结果出现乱码:npm
代码以下:windows
$(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库实现解码,代码以下:ide
$(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(); });
代码说明:
一、 首先要引入iconv-lite库,若是没安装,则使用“npm install iconv-lite”命令安装;
二、 为exec函数指定encodeing参数为GBK;
三、 在workerProgress的close事件中,首先用Buffer.concat()将获得的执行结果合并到一个二进制数组里,而后用iconv.decode()函数完成转码;
执行效果以下:函数