使用exec()执行DOS命令dir,结果出现乱码:
目前创新互联建站已为上1000+的企业提供了网站建设、域名、虚拟主机、网站托管、服务器托管、企业网站设计、罗甸网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
代码如下:
$(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()函数完成转码;
执行效果如下: