我的代码(称之为无限)回显开始和ping状态改变
@echo off
rem set details=""
set arg1=%1
set history="none"
set current_status="none"
Set COUNTER=0
:loop
set /A COUNTER=COUNTER+1
ping -n 1 %arg1% | find /i "reply" > log.txt
if %errorlevel% equ 0 (
set /p details=<log.txt
set current_status="yes"
echo %current_status%
)
if %errorlevel% equ 1 (
set current_status="no"
echo %current_status%
)
if %history% equ "none" (
echo %COUNTER%
echo %time%
if %current_status% equ "yes" (
echo %details%
)
if %current_status% equ "no" (
echo can't ping %arg1%
)
echo.
)
if %history% equ "yes" if %current_status% equ "no" (
echo %COUNTER%
echo %time%
echo can't ping %arg1%
echo.
)
if %history% equ "no" if %current_status% equ "yes" (
echo %COUNTER%
echo %time%
echo %details%
echo.
)
set "history=%current_status%"
rem echo history=%history%
sleep 1
goto loop
[/code]
我使用外部文件sleep.exe在1秒后检查。
这是我将活动IP和非活动IP作为唯一参数逐个无限地传递时的输出
C:\Users\si>infiniteping 172.16.92.1
"none"
1
17:32:30.84
Reply from 172.16.92.1: bytes=32 time=2ms TTL=64
"yes"
"yes"
"yes"
"yes"
"yes"
^CTerminate batch job (Y/N)? y
C:\Users\si>infiniteping 172.16.92.100
"none"
1
17:33:02.58
can't ping 172.16.92.100
"no"
"no"
我无法理解回声的原因&#34;没有&#34;而不是一开始是或否?
答案 0 :(得分:2)
@echo off
rem set details=""
set arg1=%1
set history="none"
set current_status="none"
Set COUNTER=0
:loop
set /A COUNTER=COUNTER+1
ping -n 1 %arg1% | find /i "reply" > log.txt
if %errorlevel% equ 0 (
set /p details=<log.txt
set current_status="yes"
)
if %errorlevel% equ 1 (
set current_status="no"
)
echo %current_status%
...
在块语句(a parenthesised series of statements)
中,解析整个块并执行然后。块中的任何%var%
将在解析块时被该变量的值替换 - 在块执行之前 - 同样的事情适用于{{1 }}
因此,FOR ... DO (block)
将在遇到IF (something) else (somethingelse)
时使用%variables%
的值执行。
解决此问题的两种常见方法是1)使用IF
并使用setlocal enabledelayedexpansion
代替!var!
来访问已更改的%var%
或2}值以进行调用一个子程序,用于使用更改的值执行进一步处理。
请注意使用显示var
更改值的CALL ECHO %%var%%
。 var
显示,但遗憾的是RESETS错误级别。
在您的情况下,CALL ECHO %%errorlevel%%
设置在括号内,因此将显示之前的值。通过更改,在括号后显示值,因此将显示 new 值。
请参阅有关current_status