批量设置变量不清除

时间:2015-03-24 22:46:55

标签: variables batch-file if-statement

好的,所以我正在努力制作一个有很多选择的批量游戏。主操作菜单部分的代码可以在下面找到。除了%c%之外的所有变量都在上面设置。无论如何,每当我进入批处理中的这一部分时,我都会输入我的选择,它只会重新加载菜单。然后,下次我输入我的选择时,无论我输入什么,它都将转到我之前输入的选择。我不知道为什么会这样做,因为我有一行说“Set”c =“哪个应该清除它,对吧?为什么菜单只在我第一次输入响应时重新加载?

任何帮助将不胜感激。如果您需要更多解释,我很乐意给出一些解释。

:action menu
if "%loc%" NEQ "Falconwood" (
echo Select an option:
echo.
echo 1. Find an Enemy to Fight
echo.
echo 2. View Inventory
echo.
echo 3. Travel
echo.
echo 4. Rest at the Inn
echo.
echo 5. Quit
echo.
echo "%c%"
set "c="
SET /P c=Your Choice: 
if "%c%" == "2" goto :inventory
if "%c%" == "3" goto :travel
if "%c%" == "4" goto :rest
if "%c%" == "5" goto :quitaction
goto :actionmenu )

REM -----HomeMenu-----
if "%loc%"=="Falconwood" (
    if "%house%"=="No" (
        echo Select an option:
        echo.
        echo 1. Buy a house
        echo.
        echo 2. View Inventory
        echo.
        echo 3. Travel
        echo.
        echo 4. Rest at the Inn
        echo.
        echo 5. Quit
        echo.
        set "c="
        SET /P c=Your Choice: 
        if "%c%" == "1" goto :houseshop
        if "%c%" == "2" goto :inventory
        if "%c%" == "3" goto :travel
        if "%c%" == "4" goto :rest
        if "%c%" == "5" goto :quitaction
        goto :actionmenu
    )
    IF "%house%"=="Yes" (
        echo Select an option:
        echo.
        echo 1. Go Home
        echo.
        echo 2. View Inventory
        echo.
        echo 3. Travel
        echo.
        echo 4. Rest at the Inn
        echo.
        echo 5. Quit
        echo.
        set "c="
        SET /P c=Your Choice: 
        REM if "%c%" == 1 goto :houseshop
        if "%c%" == 2 goto :inventory
        if "%c%" == 3 goto :travel
        if "%c%" == 4 goto :rest
        if "%c%" == 5 goto :quitaction
        goto :actionmenu
    )
goto :actionmenu )

1 个答案:

答案 0 :(得分:0)

CMD在解析命令而不是运行命令时扩展变量。因此,在这种情况下,当您在if块(命令)中设置变量并尝试在同一块中使用它们时,它将被视为单个命令。这就是说,扩展发生在执行块之前,其中变量c被替换为执行块之前的值。在批处理文件的开头放置setlocal enabledelayedexpansion,并在块中使用!c!代替%c%。有关详细信息,请参阅this

这可能会更好地说明:

@echo off
set var1=true
if "%var1%"=="true" (
set var2=false
echo %var2%
)
pause

以上代码会为ECHO is off.提供%var2%结果,这意味着它没有设置。

@echo off
setlocal enabledelayedexpansion
set var1=true
if "%var1%"=="true" (
  set var2=false
  echo !var2!
)
pause

上面的代码会为false

提供!var2!