是的。標準delayedexpansion
的問題。這裏有很多很多很多的例子。
在塊語句(a parenthesised series of statements)
,所述整個塊被解析並然後執行。該塊內的任何%var%
將在該塊被解析時由該變量的值取代 - 在塊執行之前 - 同樣的事情適用於FOR ... DO (block)
。
因此,在遇到IF
時,將使用%variables%
的值執行IF (something) else (somethingelse)
。克服這個
兩種常用方法是:1)使用setlocal enabledelayedexpansion
並使用!var!
代替%var%
訪問的var
改變的值或2),以調用一個子程序使用改變的值來執行進一步的處理。
此外,因爲您的批處理既不重置state
終止時也不使用setlocal
自動清除的變化對終端的環境,在隨後的運行中,先前設置的state
值用於(因此是第一次,你'd得到echo is off
並且之後掃描最後的服務器的狀態)
IF NOT ERRORLEVEL 1 (set state=UP) ELSE (set state=DOWN)
哦!這裏的模糊思維 - 它變得流行,不僅僅是常見。有什麼問題
IF ERRORLEVEL 1 (set state=DOWN) ELSE (set state=UP)
這是更直截了當,不涉及雙重否定?
解決方案1:
@echo off
setlocal enabledelayedexpansion
for /L %%x in (18,1,25) do (
for /L %%y in (1,1,254) do (
for /L %%z in (1,1,254) do (
ping -n 1 172.%%x.%%y.%%z | find "Reply" > NUL
IF ERRORLEVEL 1 (set state=DOWN) ELSE (set state=UP)
echo 172.%%x.%%y.%%z is !state! >> state.txt
)))
解決方案2:
@echo off
for /L %%x in (18,1,25) do (
for /L %%y in (1,1,254) do (
for /L %%z in (1,1,254) do (
ping -n 1 172.%%x.%%y.%%z | find "Reply" > NUL
(
IF ERRORLEVEL 1 (echo 172.%%x.%%y.%%z is DOWN
) ELSE (echo 172.%%x.%%y.%%z is UP
)
)>> state.txt
)))
似乎被更換後,我的系統工作正常* * ping -n 1 172.%x。%y。%z ** with ** ping -n 1 172。%% x。%% y。%% z **在腳本中。沒有其他改變。 – r3ap3r