簡體   English   中英

Windows批處理文件中的回顯變量行為異常

[英]echo variable misbehaving in windows batch file

我的代碼(稱它為無窮大)在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"

我不明白首先回顯“ none”而不是“ yes”或“ no”的原因?

@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%都將由該變量的值替換-同樣的情況也適用於FOR ... DO (block)

因此,將在遇到IF時使用%variables%的值執行IF (something) else (somethingelse)

解決此問題的兩種常用方法是:1)使用setlocal enabledelayedexpansion和使用!var! 代替%var%訪問的改變值var或2),以調用一個子程序使用改變的值來執行進一步的處理。

因此請注意,使用的CALL ECHO %%var%% ,其顯示的改變值var 顯示CALL ECHO %%errorlevel%% ,但遺憾的是隨后出現了RESETS錯誤級別。

在您的情況下, current_status設置在括號內,因此將顯示先前的值。 進行更改后,該值將顯示括號后,因此將顯示值。

請參閱SO上有關delayedexpansion任何文章

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM