2012-08-09 53 views
2

我正在接受輸入並做一些簡單的數學運算的短批處理文件程序。它似乎對除第一個回聲以外的所有內容都正確工作。下面是代碼:簡單的批處理文件如果()失敗

set /p usercommand= "Input:" 
if "%usercommand%" equ "done" (

set /p usertimeouthours= "Input Hours: " 
echo (%usertimeouthours%) 

set /p usertimeoutminutes= "Input Minutes: " 
echo (%usertimeoutminutes%) 

set /p usertimeoutseconds= "Input Seconds: " 
echo (%usertimeoutseconds%) 

set /a answer= %usertimeouthours%*3600+%usertimeoutminutes%*60+%usertimeoutseconds% 
echo %answer% 

goto end 
) else (
echo finished 
goto user 
) 
:end 

爲什麼第一回波只能輸出

我的猜測是,什麼是錯的我的if語句,沒有人知道我應該怎麼改它?

謝謝!

回答

1

問題1 - 正常與變量的延遲擴展
正常擴展使用%var%發生在解析時間,並且整個IF語句一次全部解析,包括括號內的內容。因此,像echo (%usertimeouthours%)這樣的東西顯示USERTIMEOUTHOURS的值,因爲它在執行IF語句之前已存在(在SET/P設置值之前)。

修復方法是使用setlocal enableDelayedExpansion在頂部啓用延遲擴展,並使用!var!而不是%var%。延遲擴展發生在執行時間而不是解析時間。

問題2 - 轉義的特殊字符
有一些有特殊含義的,並且必須是字符要麼逃脫^或者,如果你想的字符被視爲一個字符串字面引用。

其中一個特殊字符是)。它將終止任何以(打開的代碼塊,除非它被轉義或引用。當您在ECHO語句中使用它時,您需要將該字符轉義爲^),因爲這些語句位於帶括號的代碼塊中。

簡化您的SET/A聲明
你不需要在SET/A的計算使用時擴展變量。你可以簡單地使用變量名而不用百分數或感嘆號。這種便利只適用於SET/A。

@echo off 
setlocal enableDelayedExpansion 
set /p usercommand= "Input:" 
if "%usercommand%" equ "done" (

    set /p usertimeouthours= "Input Hours: " 
    echo (!usertimeouthours!^) 

    set /p usertimeoutminutes= "Input Minutes: " 
    echo (!usertimeoutminutes!^) 

    set /p usertimeoutseconds= "Input Seconds: " 
    echo (!usertimeoutseconds!^) 

    set /a answer= usertimeouthours*3600+usertimeoutminutes*60+usertimeoutseconds 
    echo !answer! 

    goto end 
) else (
    echo finished 
    goto user 
) 
:end 
+0

首先是夢幻般的答案。其次,我明白執行何時發生,但什麼時候解析發生?換句話說,你可以給我一個簡短的解釋批處理文件的運行方式嗎?你可以在評論中迴應,或者我可以問它作爲另一個問題,如果你想代表它;) – jth41 2012-08-09 04:56:48

+1

@John - 你問它:-)看看[jeb的回答](http://stackoverflow.com/ a/4095133/1012053)的問題「Windows命令解釋器(CMD.EXE)如何解析腳本?」 – dbenham 2012-08-09 05:24:57

+0

那個鏈接正是我所需要的。非常感謝。也在一個完全不相關的說明。我只是看着你的個人資料,你給出了非常好的答案..但你幾乎從不問問題爲什麼? – jth41 2012-08-09 05:45:49