gpt4 book ai didi

node.js - 使用node.js在cmd中执行 'tracert',但我的输出不一致

转载 作者:太空宇宙 更新时间:2023-11-04 01:30:34 33 4
gpt4 key购买 nike

我正在尝试编写一个在cmd中执行tracert的node.js脚本,并且我想解析tracert的输出以便能够在node中使用。我的问题是我收到的输出不一致。

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.1

console.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

我不希望这种事发生。我希望每次数据变量进入时,它只包含每个“列”中的“一个元素”

最佳答案

遗憾的是,您无法强制 tracert 逐列发送数据。此外,当您的进程速度不够快,无法从管道读取列时,您不能强制操作系统不“加入”缓冲区中的列。

唯一可能的解决方案是等到整行准备好然后才解析它。 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) {
...
}
}
});

关于node.js - 使用node.js在cmd中执行 'tracert',但我的输出不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56265325/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com