如何从成功的ping命令中提取IP地址?


2

在其他用户的帮助下,我可以从CMD的单个输出中剪切字符。然后我添加了我的下一部分代码,他给我留下了变量_3octet。我的代码扫描与计算机连接的网关关联的所有IP地址,并仅阻止有回复的网关。从那里我得到一份已经回复的IP列表。

Reply from 192.168.1.67: bytes=32 time=288ms TTL=64

Reply from 192.168.1.72: bytes=32 time<1ms TTL=128

Reply from 192.168.1.73: bytes=32 time=16ms TTL=64

Reply from 192.168.1.75: bytes=32 time<1ms TTL=128

Reply from 192.168.1.76: bytes=32 time=155ms TTL=64

Reply from 192.168.1.88: bytes=32 time=1ms TTL=255

从那里我想只抓取IP地址,因此切除除“192.168.1。#”之外的所有内容,以便在程序的未来部分中使用。类似于带_3octet变量的代码的开头部分。这是我的代码。

@echo off
setlocal
setlocal enabledelayedexpansion
rem throw away everything except the IPv4 address line 
for /f "usebackq tokens=*" %%a in (`ipconfig ^| findstr /i "ipv4"`) do (
rem we have for example "IPv4 Address. . . . . . . . . . . : 192.168.42.78"
rem split on : and get 2nd token
for /f delims^=^:^ tokens^=2 %%b in ('echo %%a') do (
    rem we have " 192.168.42.78"
    rem split on . and get 4 tokens (octets)
    for /f "tokens=1-4 delims=." %%c in ("%%b") do (
        set _o1=%%c
        set _o2=%%d
        set _o3=%%e
        set _o4=%%f
        rem strip leading space from first octet
        set _3octet=!_o1:~1!.!_o2!.!_o3!.
        echo !_3octet!
        )
    )
)
cd C:\Windows
for /l %%i IN (1,1,254) do ping -n 1 !_3octet!%%i | for /f delims^=^:^ tokens^=1 %%g in (find /i "bytes=32") do (
for /f "tokens=1-4 delims=." %%j in ("%%g") do (
    set _o1=%%j
    set _o2=%%k
    set _o3=%%l
    set _o4=%%m
    set _4octet=!_o1:~11!.!_o2!.!_o3!.!_o4!
    echo !_4octet!
    )
)
endlocal

: was unexpected at this time.多次作为输出。这告诉我它试图ping每个地址1-254而不是那些作为回复的地址。不用说我的代码没有像我希望的那样工作。

我计划在此代码中使用最终的IP地址列表:shutdown -r -m \\192.168.1.1 -t 10以关闭连接到网关的计算机。

如果这一点令人困惑,请告诉我。谢谢。


for /l %%i in (1,1,254) do ping -n 1 !_3octet!%%i do ( for /f "delims=: tokens=1" %%g in (find /i "bytes=32") 这就是“参数不好”。
Samuel Pauk 2016年

Answers:


2

我想只从成功的ping中获取IP地址

我不打算尝试修复批处理文件的第二部分,从头开始编写它更容易。

使用以下批处理文件(test.cmd):

@echo off
setlocal
setlocal enabledelayedexpansion
rem throw away everything except the IPv4 address line 
for /f "usebackq tokens=*" %%a in (`ipconfig ^| findstr /i "ipv4"`) do (
rem we have for example "IPv4 Address. . . . . . . . . . . : 192.168.42.78"
rem split on : and get 2nd token
for /f delims^=^:^ tokens^=2 %%b in ('echo %%a') do (
    rem we have " 192.168.42.78"
    rem split on . and get 4 tokens (octets)
    for /f "tokens=1-4 delims=." %%c in ("%%b") do (
        set _o1=%%c
        set _o2=%%d
        set _o3=%%e
        set _o4=%%f
        rem strip leading space from first octet
        set _3octet=!_o1:~1!.!_o2!.!_o3!.
        echo !_3octet!
        )
    )
)
for /l %%i in (1,1,254) do (
  rem do the ping and grab the 3rd token (ip address) if it succeeds (TTL= is found)
  for /f "usebackq tokens=3" %%j in (`ping -n 1 !_3octet!%%i ^| find "TTL="`) do (
      rem we have ip address with a trailing :
      rem split on . and get the 4th token (last octet)
      rem we don't need the first 3 as they are already in !_3octet!
      for /f "tokens=4 delims=." %%k in ("%%j") do (
        set _o4=%%k
        rem strip trailing : from last octet
        set _4octet=!_o4:~0,-1!
        echo !_4octet!
      )
    )
  )
endlocal

笔记:

  • 您想要的值保存在!_3octet!!_4octet!哪里

    • !_3octet!和以前一样

    • !_4octet!是最后一个八位字节(你不需要两次提取前3个八位字节!)

  • 你不需要 cd C:\Windows

  • 其中一个IP地址将是您的网关(路由器)地址,您可能不想尝试shutdown在网关上运行!


进一步阅读

  • Windows CMD命令行的AZ索引 - 与Windows cmd行相关的所有内容的出色参考。
  • enabledelayedexpansion - 延迟扩展将导致变量在执行时而不是在解析时扩展。
  • for / f - 针对另一个命令的结果的循环命令。
  • ipconfig - 配置IP(Internet协议配置)
  • set - 显示,设置或删除CMD环境变量。使用SET进行的更改将仅在当前CMD会话期间保留。
  • setlocal - 设置选项以控制批处理文件中环境变量的可见性。
  • 变量 - 提取变量的一部分(子串)。

这很有道理!非常感谢你!
Samuel Pauk 2016年

@SamuelPauk我现在要睡觉了(这是凌晨1点)。如果它不能正常工作(非常可能,因为它是复杂的解析,我没有网络来测试它),请告诉我,明天我会看一下。
DavidPostill
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.