我正在尝试编写一个在cmd中执行tracert的node.js脚本,并且我想解析tracert的输出,以便能够在节点中使用。我的问题是,我收到的输出不是一致的。
let argument = process.argv[2] /* what the user enters as first argument */
const { spawn } = require('child_process');
const command = spawn(process.env.comspec, ['/c', 'tracert', argument])
command.stdout.on('data', (data) => {
console.log(`stdout: ${data}`);
});对于每一跳,每行上的tracert输出都是这种格式。
1 5 ms 6 ms 4 ms 192.168.1.1console.log的预期输出应为:
stdout: 1
stdout: 5 ms
stdout: 6 ms
stdout: 4 ms
stdout: 192.168.1.1事实上,90%的情况下都会发生这种情况,但有时数据来得太快了,以至于一些行在同一行上,就像这样
stdout: 1
stdout: 5 ms
stdout: 6 ms 4 ms
stdout: 192.168.1.1我不希望这事发生。我希望每次数据变量进入时,它只包含每个“列”中的“一个元素”。
发布于 2019-05-23 05:46:41
不幸的是,您不能强制tracert逐列发送数据。此外,当您的进程速度不足以从管道中读取列时,您不能强制OS“连接”缓冲区中的列。
唯一可能的解决方案是等待整个行都准备就绪,然后才对其进行解析。Stg这样(警告,这只是伪代码)。
let bufffer = "";
command.stdout.on('data', (data) => {
buffer = buffer + data;
while (buffer.indexOf('\n') != -1) { // loop because in some cases you can even receive many lines
const idx = buffer.indexOf('\n');
const line = buffer.substr(0, idx).trim(); // get line and trim extra whitespace
buffer = buffer.substr(idx+1); // rest of buffer, usually empty string
// now parse line with regexp or something
const match = /(\d+) (\d+) ms +(\d+) ms +(\d+) ms ([^ ]+)/.match(line);
if (match) {
...
}
}
});https://stackoverflow.com/questions/56265325
复制相似问题