簡體   English   中英

Windows批處理if-else不起作用

[英]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.

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