如何将child_process中exec()执行tasklist的结果转为JSON格式?
将tasklist输出转换为JSON格式的简便方案
优先推荐:利用tasklist内置参数输出CSV格式再解析
Windows的tasklist命令支持直接输出结构化的CSV格式,这比解析纯文本表格更简单可靠。只需添加/fo csv参数指定输出格式,/nh参数可去掉表头行(可选)。
代码示例(使用第三方CSV解析库)
先安装csv-parser模块:
npm install csv-parser
编写代码:
const { exec } = require('child_process'); const csv = require('csv-parser'); const { PassThrough } = require('stream'); // 执行tasklist并指定输出CSV格式,编码设为utf16le适配Windows Unicode输出 exec('tasklist /fo csv /nh', { encoding: 'utf16le' }, (err, stdout, stderr) => { if (err) { console.error('执行出错:', err); return; } const processList = []; // 将字符串转为流,方便用csv-parser处理 const stream = new PassThrough(); stream.end(stdout); stream .pipe(csv({ // 自定义表头字段名 headers: ['imageName', 'pid', 'sessionName', 'sessionNumber', 'memUsage'] })) .on('data', (data) => { // 可选:将数字类型字段转为数值 data.pid = parseInt(data.pid, 10); data.sessionNumber = parseInt(data.sessionNumber, 10); data.memUsage = parseInt(data.memUsage.replace(/[,\sK]/g, ''), 10); processList.push(data); }) .on('end', () => { console.log('转换后的JSON:', JSON.stringify(processList, null, 2)); }); });
代码示例(无第三方依赖,手动解析CSV)
如果不想安装额外模块,可自行解析CSV字符串:
const { exec } = require('child_process'); exec('tasklist /fo csv /nh', { encoding: 'utf16le' }, (err, stdout, stderr) => { if (err) { console.error('执行出错:', err); return; } // 按行分割并过滤空行 const lines = stdout.split('\r\n').filter(line => line.trim() !== ''); const headers = ['imageName', 'pid', 'sessionName', 'sessionNumber', 'memUsage']; const processList = lines.map(line => { // 匹配CSV字段(处理带引号的含空格字段) const values = line.match(/"[^"]+"|[^,]+/g).map(val => val.replace(/^"|"$/g, '')); return headers.reduce((obj, key, index) => { let value = values[index]; // 类型转换 switch(key) { case 'pid': case 'sessionNumber': obj[key] = parseInt(value, 10); break; case 'memUsage': obj[key] = parseInt(value.replace(/[,\sK]/g, ''), 10); break; default: obj[key] = value; } return obj; }, {}); }); console.log('转换后的JSON:', JSON.stringify(processList, null, 2)); });
备选方案:解析原始表格文本
如果必须处理原始表格输出(不使用CSV参数),可通过分析列宽度分割每行数据:
const { exec } = require('child_process'); exec('tasklist', { encoding: 'utf16le' }, (err, stdout, stderr) => { if (err) { console.error('执行出错:', err); return; } const lines = stdout.split('\r\n').filter(line => line.trim() !== ''); if (lines.length < 3) return; // 提取表头和分隔线,计算列宽度 const headerLine = lines[0].trim(); const separatorLine = lines[1].trim(); const columnWidths = []; let currentWidth = 0; for (const char of separatorLine) { if (char === '=') { currentWidth++; } else if (currentWidth > 0) { columnWidths.push(currentWidth); currentWidth = 0; } } if (currentWidth > 0) columnWidths.push(currentWidth); // 生成表头字段名 const headers = columnWidths.map((width, idx) => { const start = idx === 0 ? 0 : columnWidths.slice(0, idx).reduce((a, b) => a + b, 0); return headerLine.substr(start, width).trim().replace(/\s+/g, ''); }); // 处理数据行 const processList = lines.slice(2).map(line => { return headers.reduce((obj, key, idx) => { const start = idx === 0 ? 0 : columnWidths.slice(0, idx).reduce((a, b) => a + b, 0); let value = line.substr(start, columnWidths[idx]).trim(); // 类型转换 if (key === 'PID' || key === 'Session#') { obj[key] = parseInt(value, 10); } else if (key === 'MemUsage') { obj[key] = parseInt(value.replace(/[,\sK]/g, ''), 10); } else { obj[key] = value; } return obj; }, {}); }); console.log('转换后的JSON:', JSON.stringify(processList, null, 2)); });
关键注意点
- 编码设置:Windows下
tasklist的输出默认是Unicode(utf16le),因此exec必须指定encoding: 'utf16le',否则会出现乱码。 - 类型转换:根据需求将PID、会话号、内存占用等字段转为数值类型,方便后续查询计算。
内容的提问来源于stack exchange,提问作者user34534
相关产品推荐
相关产品推荐

