使用批处理文件从文本文件中读取一个字符串并复制到另一个文本文件。

3
我要做的基本上是读取包含ping结果的文本文件,检测特定字符串并将其复制到另一个文本文件中。我想要复制的字符串是示例中加粗的部分。

Envoi d'une requˆte 'ping' sur star.c10r.facebook.com [31.13.81.17] avec 32 octets de donn‚esÿ: R‚ponse de 31.13.81.17ÿ: octets=32 temps=77 ms TTL=240

Statistiques Ping pour 31.13.81.17: Paquetsÿ: envoy‚s = 1, re‡us = 1, perdus = 0 (perte 0%), Dur‚e approximative des boucles en millisecondes : Minimum = 77ms, Maximum = 77ms, Moyenne = 77ms

我尝试执行此程序,但变量"resultat"未出现在结果中。
@echo off
setlocal enabledelayedexpansion

set OUTPUT_FILE=result.txt
>nul copy nul %OUTPUT_FILE%

for /f %%i in (testservers.txt) do (
  set SERVER_ADDRESS=ADDRESS N/A
  for /f "tokens=1,2,3,4" %%a in ('ping -n 1 %%i ^&^& echo SERVER_IS_UP') do (
       if %%a==R,ponse set resultat="%%b %%c %%d"
        )

   echo %%i [!SERVER_ADDRESS::=!] is resultat >>%OUTPUT_FILE%
)

谢谢。

感谢 @Matt 的帮助,我得以编辑我的代码:

@echo off
setlocal enabledelayedexpansion

set OUTPUT_FILE=result.txt

for /f %%i in (testservers.txt) do (
  if not exist %OUTPUT_FILE% type NUL>%OUTPUT_FILE%
  for /f "tokens=2 delims=:" %%a in ('ping -n 1 %%i ^| find "TTL="') do (
   if errorlevel 0  set resultat=UP: %%a 
  )

  echo %%i is !resultat! >> %OUTPUT_FILE%
  set resultat=DOWN
)

我将 "resultat" 的默认值设置为 DOWN,因为我注意到只有在找到 "TTL" 时它才会更改,这意味着服务器是 UP 的。如果没有找到,程序将显示 "resultat" 的默认值,即 DOWN。如果服务器是 UP 的,那么 "octets=32 temps=77 ms TTL=240" 部分将被显示以显示统计信息。结果如下所示:

www.google.com 是 UP: octets=32 temps=470 ms TTL=42

www.facebook.com 是 UP: octets=32 temps=326 ms TTL=241
192.168.1.15 是 UP: octets=32 temps<1ms TTL=128
10.21.107.90 是 Down

感谢您的帮助。

为什么这个 ^&^& echo SERVER_IS_UP 和那个 !SERVER_ADDRESS::=!?两者都没有影响。 - Endoro
@Endoro 我删除了那两个部分,因为实际上它们没有任何影响。谢谢。 - Ouss
1个回答

1
我看到这里有几个问题。在说服务器已经启动之前,你实际上没有检查你的ping是否成功。你没有正确使用SERVER_ADDRESS变量,也没有将resultant作为变量调用。
看看这个是否可以解决问题。
@echo off
setlocal enabledelayedexpansion

set OUTPUT_FILE=result.txt

for /f %%i in (testservers.txt) do (
  if not exist %OUTPUT_FILE% type NUL>%OUTPUT_FILE%
  set SERVER_ADDRESS=ADDRESS N/A
  for /f "tokens=2 delims=:" %%a in ('ping -n 1 %%i ^| find "TTL="') do (
   if errorlevel 0 echo %%1 is up && set resultat=%%a
   if errorlevel 1 echo %%i is down && set resultat=%%a is down
  )

  echo %%i [!SERVER_ADDRESS!::=] is !resultat! >>%OUTPUT_FILE%
  set resultat=

)


谢谢@Matt,你的回答帮了我很多。关于你提出的程序,我想补充几点:
  • 对于变量“resultat”,在每次迭代后显示它之前应该将其重置,因为如果条件未被验证,程序将显示“resultat”上一次的值。
  • 我尝试在errorlevel不为0时显示“服务器已关闭”,但它不起作用,我真的不知道为什么。这是我尝试过的内容:“if errorlevel 0 (echo %%i is UP: %%a >>%OUTPUT_FILE% ) else (echo %%i is DOWN: %%a>> %OUTPUT_FILE%)”。
- Ouss
谢谢@Matt。我已经编辑了代码,写在了问题部分。你的评论非常有帮助。 - Ouss

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接