好的,所以我正在努力制作一个有很多选择的批量游戏。主操作菜单部分的代码可以在下面找到。除了%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 )
答案 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!