[英]Windows batch if-else not working
[一個簡單的程序,它接收一個整數作為輸入,並在該數字微不足道的情況下進行打印]
當我運行它時,我得到一個錯誤“(此時是意外的”
@echo off
set /a i=2
set /p input="enter an integer: "
set /a n=input
set /a t=n/2
:loop1
if %t% LSS %i% (
goto trivial
) else (
set /a t0=n%i
if %t0%==0 (
goto notTrivial
) else (
set /a i=i+1
goto loop1
)
)
:trivial
echo %n% is trivial
goto endd
:notTrivial
echo %n% is not trivial
:endd
pause > nul
但是當我在loop1中刪除else語句時(不需要btw(由於if塊中有goto命令)),它可以工作
:loop1
if %t% LSS %i% (
goto trivial
)
set /a t0=n%i
if %t0%==0 (
goto notTrivial
) else (
set /a i=i+1
goto loop1
)
(這怎么可能?
當您刪除else
子句時,其中的代碼現在不在任何塊內。
為什么這有關系? 因為在批處理文件中,將首先解析行或行塊(括號內的代碼),然后執行。 除去已解析的變量讀取操作后,在開始執行命令之前,在解析時將其替換為變量內部的值(更多信息請參見此處 )。
因此,在這段代碼中
) else (
set /a t0=n%i
if %t0%==0 (
goto notTrivial
) else (
set /a i=i+1
goto loop1
)
)
您可以更改變量t0
的值,但不能在同一塊內檢索此更改后的值。 但是,如果刪除else
子句,則代碼不在塊內,並且一切都會按預期工作(語法錯誤除外,請嘗試使用set /a "t0=n %% i"
)。
首先,您需要在批處理文件中將模運算符%
為%%
。
其次,只需在if
塊開始之前將命令set /a t0=n%%i
向上移動,則它將起作用:
:loop1
set /a t0=n%%i
if %t% LSS %i% (
goto trivial
) else (
if %t0% EQU 0 (
goto notTrivial
) else (
set /a i+=1
goto loop1
)
)
因此,將變量t0
的更改移至命令塊()
。
另外,您也可以啟用延遲擴展 :
setlocal EnableDelayedExpansion
rem INITIAL CODE PORTION...
:loop1
if %t% LSS %i% (
goto trivial
) else (
set /a t0=n%%i
if !t0! EQU 0 (
goto notTrivial
) else (
set /a i+=1
goto loop1
)
)
rem REMAINING CODE PORTION...
endlocal
您會注意到!t0!
類型擴展,與%t0%
相反,它將在執行時而不是解析時擴展t0
。
另請參見setlocal /?
和endlocal /?
有關這些命令的更多信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.