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解码。
未完待续
原文地址:https://blog.csdn.net/thlzjfefe" target="_blank" rel="noopener" title="thlzjfefe">thlzjfefe</a> <img class="article-time-img article-heard-img" src="https://csdnimg.cn/release/blo
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。