【问题标题】:Read a string from a text file and copy it on another text file using batch file从文本文件中读取字符串并使用批处理文件将其复制到另一个文本文件中
【发布时间】:2013-05-02 20:16:13
【问题描述】:

我要做的基本上是读取一个包含 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

统计平倒 31.13.81.17: Paquetsÿ: envoy‚s = 1, re‡us = 1, perdus = 0 (perte 0%), Dur‚e approximative des boucles en 毫秒: 最小值 = 77ms,最大值 = 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。 “octets=32 temps=77 ms TTL=240”部分只会在服务器启动时显示以显示统计信息。结果是这样的:

www.google.com 已启动:octets=32 temps=470 ms TTL=42

www.facebook.com 已启动:八位字节=32 临时=326 毫秒 TTL=241
192.168.1.15 已启动:八位字节=32 temps 10.21.107.90 已关闭

感谢您的帮助。

【问题讨论】:

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

标签: batch-file cmd ping


【解决方案1】:

我在这里看到了一些问题。在您说 SERVER_IS_UP 之前,您实际上并没有检查 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”有。 - 我试图在错误级别不为 0 的情况下显示“服务器已关闭”但它不起作用,我真的不知道为什么。这是我尝试过的:“如果错误级别 0 (echo %%i is UP: %%a >>%OUTPUT_FILE%) else (echo %%i is DOWN: %%a>> %OUTPUT_FILE%)”
  • 谢谢@Matt。我编辑了代码,我在问题部分写了它。你的评论很有帮助。
猜你喜欢
  • 1970-01-01
  • 2019-11-13
  • 1970-01-01
  • 2010-12-09
  • 1970-01-01
  • 2013-04-23
  • 1970-01-01
  • 1970-01-01
  • 2014-02-24
相关资源
最近更新 更多