【问题标题】:Ping a user defined IP-Range with batch使用批处理 Ping 用户定义的 IP 范围
【发布时间】:2015-09-14 20:00:32
【问题描述】:

我正在做一个学校项目,我想创建一个批处理文件来 ping 用户定义的 IP 范围并将成功的 ping 写入 txt 文件。

现在我被困在FOR 循环中:

@echo off
SET /p IPRange=Bitte IP-Range eingeben(xxx.xxx.xxx) :
SET /p AnfangsIP=Bitte AnfangsIP des Bereiches eingeben :
SET /p EndIP=Bitte EndIP des Bereiches eingeben :

FOR /L %IP% (%AnfangsIP%,1,%EndIP%) DO (
    ping -n 1 %IP-Range%.%IP% | find "TTL=" >nul
    if errorlevel 1 (
        echo %IP-Range%.%IP% not reachable
    ) else (
        echo %IP-Range%.%IP% reachable
    )
)

pause>nul

批处理文件使用以下参数执行:IP 范围、起始 IP 地址、结束 IP 地址。我的目标是创建一个for 循环,在每个循环中增加变量%IP%。从start IP-addressend IP-address

我在论坛中搜索过,但只有单个 ping 不是针对整个 IP 范围的。

【问题讨论】:

  • 延迟扩展问题。在括号内的代码块中,您需要延迟变量的扩展。否则,它们会保留循环开始时的任何值。此外,for /L 的语法是for /L %%X。这是双百分比,一个字母的变量。有关更多信息,请参阅 cmd 控制台中的 help forfor /L %IP% 不会工作。最后,for /L 循环遍历 整数。它不能增加完全合格的 IP。但是,如果您愿意,它可以增加最后一个八位字节,但前提是您将其视为独立整数。
  • 你好 wOxxxOm。谢谢你的协助。单字母变量对我有很大帮助:) 现在我将研究如何解决整数问题。必须有一种方法可以将 a 字符串导入 for 循环... :)
  • 最好检查一下微软提供的portqry工具。

标签: batch-file for-loop ping


【解决方案1】:

试试这个:

@echo off

SET /p IPRange=Bitte IP-Range eingeben(xxx.xxx.xxx) :
SET /p AnfangsIP=Bitte AnfangsIP des Bereiches eingeben :
SET /p EndIP=Bitte EndIP des Bereiches eingeben :

FOR /L %%I IN (%AnfangsIP%,1,%EndIP%) DO (
    ping -n 1 %IPRange%.%%I | find "TTL=" >nul
    if errorlevel 1 (
        echo %IPRange%.%%I not reachable
    ) else (
        echo %IPRange%.%%I reachable
    )
)

pause>nul

编辑添加了输出示例

C:\> test.bat
Bitte IP-Range eingeben(xxx.xxx.xxx) :127.0.0
Bitte AnfangsIP des Bereiches eingeben :0
Bitte EndIP des Bereiches eingeben :7
127.0.0.0 not reachable
127.0.0.1 reachable
127.0.0.2 reachable
127.0.0.3 reachable
127.0.0.4 reachable
127.0.0.5 reachable
127.0.0.6 reachable
127.0.0.7 reachable

【讨论】:

  • 对我不起作用 ;(。当我完成 3 个“集合”时,它只是黑色,什么都不做......
  • @LukasLustenbergerLoeschdu,你为这三个sets 输入了什么?
  • 好吧,我现在没有做错什么。现在它也适用于我
  • @Aacini IF ERRORLEVEL 1 则 PING 不起作用。在您的代码中,您必须编写“IF NOT ERRORLEVEL 1”或切换 else 的内容和 if...
  • @LukasLustenbergerLoeschdu:嗯,你应该意识到这不是“我的代码”,而是由你发布的原始代码的精确副本;我刚刚按照问题中的要求修改了FOR 命令部分:“现在我被困在FOR 循环中”。如果if errorlevel 1部分有任何错误,你应该清楚原始代码中已经存在这个错误... :(
【解决方案2】:

伙计们

非常感谢您的回答。最后,Aacini 的脚本起作用了。随着时间的推移,我制作了一个没有任何 for 循环的脚本,这不是那么漂亮......

这是代码:

@ECHO off
COLOR F0

:START
BREAK>PINGLOG.txt

CLS
SET /P range=Bitte IP-Range eingeben(xxx.xxx.xxx):
CLS
SET /P sIP=Bitte Start-IP eingeben(xxx):
CLS
SET /P eIP=Bitte End-IP eingeben(xxx):
CLS

SET /P JN1=START PING FROM %range%.%sIP% - %range%.%eIP%?(Y/N):

CLS
SET /A counter=%sIP%
SET /A endIP=%eIP%
SET /A endIP+=1
CLS

IF /I %JN1%==Y (
    GOTO PINGRANGE
) ELSE (
    GOTO ENDE2
)

:PINGRANGE
COLOR 7C
PING -n 1 %range%.%counter% | find "TTL=" >nul
IF NOT ERRORLEVEL 1 (
    ECHO ------------------------------------------------- >>PINGLOG.txt
    ECHO %range%.%counter% is reachable! >>PINGLOG.txt
    ECHO %range%.%counter% is reachable!
) ELSE (
    ECHO %range%.%counter% is not reachable!
)

SET /A counter+=1
GOTO CHECK
)

:CHECK
IF %counter%==%endIP% (
    GOTO ENDE1
) ELSE (
    GOTO PINGRANGE
)

:ENDE1
COLOR F0
ECHO -------------------------------------------------
SET /P JN2= FINISH! WOULD YOU SEE THE LOGFILE?(Y/N):
IF /I %JN2%==Y (
    START NOTEPAD "PINGLOG.txt"
) ELSE (
    EXIT cmd.exe
)

:ENDE2
COLOR F0
ECHO -------------------------------------------------
SET /P JN3= NEW IP-RANGE PING?(Y/N):
IF /I %JN3%==Y (
    GOTO START
) ELSE (
    EXIT cmd.exe
)

我现在觉得这不是很漂亮:)

祝你有美好的一天 卢卡斯

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多