2012-01-12 11 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キーを押し、デフォルトのアクションを選択した場合、それはOKです。しかし、私はNキーまたはYキーを使用すると、PATH_EXISTS_ANSWERの値が定義されていないように見えます。スクリプトは別のループを経て、私の答えにかかわらず、スクリプトsomewhyは以前の答えを使用します。 たとえば、私はYスクリプトに答えると再び尋ねます。もし私がNを選んだら "はい"と答えます。 何が間違っていますか?

+0

私は、カーソルがIFブロックから出るときに、変数の実際の値を評価するという疑いがあります。しかし、なぜ? –

答えて

1

あなたは@echo offした後で次のように配置する必要があります。

SETLOCAL EnableDelayedExpansion 

その後、あなたはPATH_EXISTS_ANSWERを参照する場合、代わりにパーセントマーク、(%)感嘆符で囲み、それを囲むの。 (!)このように:!PATH_EXISTS_ANSWER!

私はそれをテストし、動作します。

+0

ありがとう!できます。 –

+0

確かに、助けになるのはうれしいです。別の幸せな顧客。 (ところで、私もupvotesを受け取ります!) –

1

変数が設定されているため、1回目の実行後に定義されます。コンソールファイルecho %PATH_EXISTS_ANSWER%でファイルを実行すると、最後に入力した内容が表示されます。

これを防ぐには、最初にPATH_EXISTS_ANSWERを空にする([])か、またはSETLOCALを追加します。

+0

たぶん私はダムですが、変数を空に設定しても機能しませんでした。 setlocalはしましたが。ありがとう! –

関連する問題