首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在cmd中使用node.js执行'tracert‘,但我的输出不一致

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

Stack Overflow用户
提问于 2019-05-23 05:34:44
回答 1查看 48关注 0票数 1

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

代码语言:javascript
复制
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输出都是这种格式。

代码语言:javascript
复制
1    5 ms     6 ms     4 ms     192.168.1.1

console.log的预期输出应为:

代码语言:javascript
复制
stdout: 1
stdout: 5 ms
stdout: 6 ms
stdout: 4 ms
stdout: 192.168.1.1

事实上,90%的情况下都会发生这种情况,但有时数据来得太快了,以至于一些行在同一行上,就像这样

代码语言:javascript
复制
stdout: 1
stdout: 5 ms
stdout: 6 ms 4 ms
stdout: 192.168.1.1

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-23 05:46:41

不幸的是,您不能强制tracert逐列发送数据。此外,当您的进程速度不足以从管道中读取列时,您不能强制OS“连接”缓冲区中的列。

唯一可能的解决方案是等待整个行都准备就绪,然后才对其进行解析。Stg这样(警告,这只是伪代码)。

代码语言:javascript
复制
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) {
             ...
         }
    }
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56265325

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档