在Windows批处理文件中回显变量行为错误

时间:2016-04-06 12:06:40

标签: windows batch-file cmd

我的代码(称之为无限)回显开始和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;而不是一开始是或否?

1 个答案:

答案 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

的任意数量的文章