1

当前形式的脚本

@echo on

setlocal EnableDelayedExpansion

set /p ipAddress="enter ip address: "

rem right now the loop is set to (1,1,50) for the sake of testing

for /l %%i in (1,1,50) do (
ping -n 1 %ipAddress%.%%i | find "TTL" > nul

if !errorlevel! == 0 (
deploy_mir.bat %ipAddress%.%%i

)
)

endlocal

然后在已知的在线主机(10.167.194.22)上运行它的结果是

C:\DOCUME~1\socuser2\MIR>test.bat

C:\DOCUME~1\socuser2\MIR>setlocal EnableDelayedExpansion

C:\DOCUME~1\socuser2\MIR>set /p ipAddress="enter ip address: "
enter ip address: 10.167.194

C:\DOCUME~1\socuser2\MIR>for /L %i in (22 1 50) do (
ping -n 1 10.167.194.%i   | find "TTL"  1>nul
if !errorlevel! == 0 (deploy_mir.bat 10.167.194.%i )
)

C:\DOCUME~1\socuser2\MIR>(
ping -n 1 10.167.194.22   | find "TTL"  1>nul
if !errorlevel! == 0 (deploy_mir.bat 10.167.194.22 )
)
"Mir Agent deployment to: 10.167.194.22"

现在最后一行意味着 !errorlevel! == 0(即,确实找到了“TTL”)所以到目前为止,脚本似乎正在运行。然而,在下一个循环中, 10.167.194.23 (alive) 以及 .30 和 .46 被跳过。我决定添加

echo %errorlevel% 

在循环结束时查看这里发生了什么。显然,在每次 ping %errorlevel% 为 0 之后如此清晰

ping -n %ipAddress%.%%i | find "TTL" >nul

是我的问题所在。根据这个说法,每次 ping 后都会发现“TTL”,这是错误的,在 10.167.194.22-.50 之间只有 3 台机器处于活动状态。

顺便说一句,当我这样做的时候

!errorlevel! == 0

这意味着什么?

这条线以下的所有内容截至 2012 年 4 月 26 日

So my new script looks like this 

@echo on


set /p ipAddress="enter ip address: "


set i=
for /l %%i in (1,1,255) do (
ping -n 1 %ipAddress%.%%i> test.txt
find "TTL" test.txt
if %errorlevel% == 0 (
deploy_this.bat %ipaddress%.%%i
)

我首先尝试了没有 if errorlevel 检查的脚本,它运行良好。它开始 ping 我提供的 IP 地址并继续到 .2 .3 .4 .5 等等。

然而,一旦我添加了这个......

if %errorlevel% == 0 (
deploy_this.bat %ipaddress%.%%i
)

这就是发生的事情

C:\DOCUME~1\socuser2\MIR>test.bat
C:\DOCUME~1\socuser2\MIR>set /p ipAddress="enter ip address: "
enter ip address: 10.167.201
C:\DOCUME~1\socuser2\MIR>set i=
C:\DOCUME~1\socuser2\MIR>

脚本就停止了。有任何想法吗?

4

3 回答 3

2

有几个问题:

  • 除非您使用该call语句,否则批处理文件将永远不会返回
  • 你少了一个括号
  • 在 FOR 循环中,您必须enabledelayedexpansion使用!ERRROLEVEL!

我建议你看看这段代码,它有一些改进:

  • 它使用 setlocal 将其变量保留给自己
  • 它不会生成临时文件
  • 可以从命令行获取 ip 地址或提示输入
  • 它是缩进的
  • 它的输出不那么冗长

这里是 :

@echo off

setlocal EnableDelayedExpansion

set ipAddress=%1

if "%ipAddress%"=="" SET /P ipAddress="enter ip address: "

for /l %%i in (1,1,2) do (

    rem Remove the > nul at the end if you want to 
    rem see the ping results in the output
    ping -n 1 %ipAddress%.%%i | find "TTL" > nul

    if !ERRORLEVEL! == 0 (
       call deploy_this.bat %ipAddress%.%%i
    )
)

endlocal
于 2012-04-25T18:57:35.190 回答
0

也许我会像这样重写你的循环:

FOR /L %%i IN (1,1,50) DO (
  ping -n 1 %ipAddress%.%%i | find "TTL" >NUL && (
    CALL deploy_mir.bat %ipAddress%.%%i
  )
)
于 2012-04-27T14:33:13.170 回答
0

与语言无关的 ping 回复分析如下:

  ping -n 1 %ipAddress%.%%i
  if errorlevel 1 goto :dead
于 2012-07-23T06:21:24.117 回答