[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[网络连接] [已解决]各位高手帮我完善“ping 多IP 网络诊断批处理脚本”

求助各位高手,帮我完善“ping 多IP 网络诊断脚本”,想要实现1.诊断结束中的丢包数与平均时间间距加大,与上面标题对齐;2.想把屏显诊断日志同时也保存一份在bat文件同目录下以当前时间命名的txt文件;3.IP地址显示加上名称备注,例如 192.168.88.5 张三电脑;4.可不可多IP并行拼,速度快些。谢谢各位帮助!!!
  1. @echo off
  2. echo .
  3. echo [!] 网络诊断中……
  4. echo .
  5. @echo off
  6. echo     日期      时间      地址        丢包数   平均时间
  7. (for /f "usebackq delims=" %%a in ("ip.txt") do (
  8.     set /p"=%date:~0,-3% %time:~0,-3% %%a--->"
  9.     for /f "tokens=4 delims==(" %%i in ('ping -n 4 %%a^|findstr /i "丢失 平均 lostavera ge"') do set /p"=%%i "
  10.     echo;
  11. ))<nul
  12. echo .
  13. echo [!] 网络诊断结束,已生成诊断日志。
  14. echo .
  15. pause
复制代码


1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

回复 1# ly_16
感谢aloha20200628回复,现日志已经可以以时间命名另存。
  1. @echo off
  2. echo .
  3. echo [!] 网络诊断中……
  4. echo .
  5. @echo off
  6.     set "outF=%date% %time:~0,-3%.txt"
  7.     set "outF=%outF::='%"
  8.     set "outF=%outF:/=-%"
  9. (echo     日期      时间      地址        丢包数   平均时间
  10. for /f "usebackq delims=" %%a in ("ip.txt") do (
  11.     set /p"=%date:~0,-3% %time:~0,-3% %%a--->"
  12.     for /f "tokens=4 delims==(" %%i in ('ping -n 4 %%a^|findstr /i "丢失 平均 lostavera ge"') do set /p"=%%i "
  13.     echo;
  14. ))<nul>"%outF%"
  15. echo .
  16. echo [!] 网络诊断结束,已生成诊断日志。
  17. echo .
  18. pause
复制代码

TOP

回复 2# ly_16

现还有几个需求也向大家请教,1.诊断结果也想同时显示在命令窗口; 2.诊断结果丢包数与平均时间数值之间间隔大些,平均时间数值右移与上标题对齐;3.想方便知道哪 IP 对应设备名称,在 IP 表中添加说明,在执行时不认?

TOP

本帖最后由 WHY 于 2023-2-9 10:39 编辑

Test.bat,保存为ANSI编码
  1. @if(0)==(0) echo off
  2. cd /d "%~dp0"
  3. echo;[!] 网络诊断中……
  4. type ip.txt | cscript //nologo //e:jscript "%~f0"
  5. echo;[!] 网络诊断结束,已生成诊断日志。
  6. pause & exit
  7. @end
  8. var max = [0, 0];                   //地址列、丢包列最大字符数
  9. var arr = [[], [], [], []];         //日期时间、地址、丢包数、平均时间共4列
  10. var out = [];                       //数组,输出到文件
  11. var fso = new ActiveXObject('Scripting.FileSystemObject');
  12. var oShell = new ActiveXObject('WScript.Shell');
  13. function formatDateTime(d){
  14.     var yy = d.getFullYear();
  15.     var MM = ('' + (101 + d.getMonth())).substr(1);
  16.     var dd = ('' + (100 + d.getDate())).substr(1);
  17.     var HH = ('' + (100 + d.getHours())).substr(1);
  18.     var mm = ('' + (100 + d.getMinutes())).substr(1);
  19.     var ss = ('' + (100 + d.getSeconds())).substr(1);
  20.     return yy + '/' + MM + '/' + dd + '    ' + HH + ':' + mm + ':' + ss;
  21. }
  22. while(!WSH.StdIn.AtEndOfStream){
  23.     var dtm = formatDateTime(new Date());             //日期格式化
  24.     var strLine = WSH.StdIn.ReadLine();               //IP地址
  25.     var match = strLine.match(/(?:\d+\.){3}\d+/);
  26.     if(!match) continue;
  27.     var oExec = oShell.Exec('ping -n 4 ' + match[0]); //调用ping
  28.     while(oExec.status < 1) WSH.Sleep(100);
  29.     var str = oExec.StdOut.ReadAll();
  30.     var match1 = str.match(/(?:丢失|Lost) = (\d+)/i);
  31.     var match2 = str.match(/(?:平均|Average) = (\d+m?s)/i);
  32.     var lost = '--->' + (match1 ? match1[1] : ' ');   //丢包数
  33.     var aver = match2 ? match2[1] : ' ';              //平均时间
  34.     arr[0].push(dtm);
  35.     arr[1].push(strLine);
  36.     arr[2].push(lost);
  37.     arr[3].push(aver);
  38.     var s1 = strLine.replace(/[^\x00-\xFF]/g, '..');  //非ASCII字符改成..
  39.     max[0] = s1.length > max[0] ? s1.length : max[0]; //地址列最大字符数
  40.     max[1] = lost.length > max[1] ? lost.length : max[1]; //丢包列最大字符数
  41. }
  42. var space1 = '', space2 = '';
  43. for(var i=0; i<max[0]; i++) space1 += ' ';     //地址列后面空格数
  44. for(var i=0; i<max[1]; i++) space2 += ' ';     //丢包列后面空格数
  45. var title = '日期          时间        ';
  46. title += '地址' + space1;
  47. title += ('丢包数' + space2).replace(/\s{2}$/, '');
  48. title += '平均时间';
  49. out.push(title);
  50. WSH.Echo(title);
  51. for(var i=0; i<arr[0].length; i++){
  52.     var str = arr[0][i] + '    ';              //日期时间列
  53.     arr[1][i] += space1;                       //地址列补齐空格
  54.     var len = arr[1][i].replace(/[^\x00-\xFF]/g, '..').length - max[0];
  55.     str += arr[1][i].replace(
  56.         new RegExp('\\s{' + len + '}$'),
  57.         function(){return '    ';}
  58.     );
  59.     str += (arr[2][i] + space2).substr(0, max[1]+4); //丢包列补齐空格
  60.     str += arr[3][i];                          //平均时间列
  61.     out.push(str);
  62.     WSH.Echo(str);
  63. }
  64. var name = formatDateTime(new Date()).replace(/[\/:\s]/g, '') + '.log';
  65. fso.OpenTextFile(name, 2, true).Write(out.join('\r\n')); //保存
复制代码
1

评分人数

    • ly_16: 太好了!各功能实现!技术 + 1

TOP

回复 4# WHY

所有功能都实现了,感谢大神!!!

TOP

回复 4# WHY
请教一下,jscript代码运行时,会提示“Microsoft JScript 运行时错误:'MZP'未定义”不知如何解决?

TOP

回复 6# ly_16


    脚本里面没有MZP变量。如果你需要修改脚本,首先要保证能看懂脚本。

TOP

回复 7# WHY
代码太深奥了,不敢乱动,要转成EXE可执行文件如何操作?

TOP

1.这个问题与本主题毫无关系;
2.不要试图挑战我的耐心。
1

评分人数

    • ly_16: 谢谢您热心帮助!技术 + 1

TOP

回复 9# WHY
再次感谢大神热心帮助!!!

TOP

返回列表