2012-01-12 54 views
1

我有以下批處理文件的代碼(?):BAT文件:奇怪SET行爲

@echo off 
SET INSTALL_PATH=c:\program files\ 
:ask_again 
if exist "%INSTALL_PATH%" (
SET /P PATH_EXISTS_ANSWER=Path exists, overwrite?[y/n/default:n] 
if not defined PATH_EXISTS_ANSWER (
    echo You chose default action^(N^). Try another installation path. 
    echo. 
    goto default 
    ) 
if /I "%PATH_EXISTS_ANSWER%"=="n" (
    echo You chose not to use existing folder. Try another installation path. 
    echo. 
    goto noc 
    ) 
if /I "%PATH_EXISTS_ANSWER%"=="y" (
    echo You chose to overwrite existing folder. Existing files will be overwritten. 
    echo. 
    goto yesc 
    ) 
echo Please choose Y or N 
echo. 
goto ask_again 
) 

:yesc 
echo you said yes 
goto end 

:default 
echo you said default 
goto end 

:noc 
echo you said no 
goto end 

:end 

而且它的確定,當我只選擇按Enter鍵默認操作。但是當我使用N或Y鍵時,PATH_EXISTS_ANSWER的值似乎是未定義的,腳本進入另一個循環,然後,無論我回答什麼,腳本somewhy使用以前的答案。 例如,如果我回答Y腳本再次詢問,如果我選擇N它鍵入「你說是」。 我在做什麼錯?

+0

我懷疑CMD.exe在光標離開IF塊時計算變量的實際值。但爲什麼? – 2012-01-12 11:55:54

回答

1

你需要把以下@echo off後:

SETLOCAL EnableDelayedExpansion 

然後,當你提到的,而不是用百分比標誌封閉它PATH_EXISTS_ANSWER,(%)括起來的驚歎號。 (!)這樣的:!PATH_EXISTS_ANSWER!

我測試了它,它工作。

+0

非常感謝!有用。 – 2012-01-12 12:14:22

+0

當然,很高興能夠有所幫助。另一個開心的顧客(順便說一下,我也接受upvotes!) – 2012-01-12 12:20:12

1

變量被設置,因此在第一次執行後定義;運行該文件,然後在控制檯類型echo %PATH_EXISTS_ANSWER%中,您將看到最後輸入的內容。

爲了防止這種情況在開始時將PATH_EXISTS_ANSWER設置爲空([])或更好地添加SETLOCAL

+0

也許我很笨,但是將變量設置爲空不起作用。雖然setlocal做到了。謝謝! – 2012-01-12 12:14:08