child_process
使用nodejs的过程中,child_process应该是比较常用的,可用于调用系统上的命令,但实际使用时可能会遇到不少的坑,尤其在windows下使用时。
一、spawn
语法参见:Child process | Node.js v16.14.2 Documentation
1、调用系统命令dir
const child_process = require('child_process');
const spawnRes = child_process.spawnSync('dir',[],{encoding: 'utf-8'});
console.log(`spawnRes:${JSON.stringify(spawnRes)}`)
此时报错如下:
spawnRes:{"error":{"errno":-4058,"code":"ENOENT","syscall":"spawnSync dir","path":"dir","spawnargs":[]},"status":null,"signal":null,"output":null,"pid":0,"stdout":null,"stderr":null}
为解决以上异常,需要添加配置:shell:true
但是在linux、mac下无需设置也可运行,但如果shell设置为true,也可以正常使用,但会额外打开一个shell进程,将会影响性能,因此为兼容各个操作系统,将配置修改为:shell: process.platform === 'win32',即:
const spawnRes = child_process.spawnSync('dir',{encoding: 'utf-8',shell: process.platform === 'win32'});
二、fs
1、乱码处理
记事本默认编码方式为ANSI,通过fs直接读取文件内容时,可能会出现乱码,可以通过iconv、iconv-lite(此性能可能会更好)转码进行解决。
const data = fs.readFileSync("C:\\test.txt",{encoding:'utf8'}).toString();
console.log(`data: ${data}`); //输出为乱码:���±�Ĭ�ϱ�����ԡ�
为保证能正常读取文件内容,需要先以二进制的方式读取文件,并将读取的内容以GBK编码方式解码:
const data = fs.readFileSync("C:\\test.txt",{encoding:'binary'});
console.log(`data:${data}`); // 此输出仍为乱码:¼Çʱ¾Ä¬ÈϱàÂë²âÊÔ¡£
// 转换为buffer
var buf = Buffer.from(data,'binary');
// 以GBK进行解码
var str = iconv.decode(buf,'GBK');
console.log(`str: ${str}`); // 此输出为:记事本默认编码测试。
如果文件以utf8方式编码且无BOM编码的,则读取时以utf8编码方式直接读取,不需要iconv解码。
未完待续