2

我为不能在 Win32 上运行的游戏编写了一个用于遗留 DOS 系统的批处理文件。该代码在 XP x86 下运行良好,但是当我在 98SE 或 DOS 中运行它时,在第一次提示后出现语法错误。由于 goto,文件运行到一个循环中。我该如何解决?

源代码:

@echo off
:PROMPT
cls
echo.
echo  Welcome to the Game Selection Wizard!
echo  --------------------------------------
echo.
echo  Please Select a Game: 
echo.
echo  1. Game1
echo  2. Game2
echo  3. Return To MS-DOS
echo.
set /p GAME= Your Current Selection: 
if %game%==1 goto Game1
if %game%==1. goto Game1
if %game%==2 goto Game2
if %game%==2. goto Game2
if %game%==3 goto QUIT
if %game%==3. goto QUIT
goto INVALID
:INVALID
cls
echo.
echo  * * * * * * * * * * * * * * * * * * * * * * * * * * *
echo  *                                                   *
echo  * ERROR:                                            *
echo  * ------                                            *
echo  * The choice you selected is wrong. Try Again!      *
echo  *                                                   *
echo  * * * * * * * * * * * * * * * * * * * * * * * * * * *
echo.
echo  Welcome to the Game Selection Wizard!
echo  -------------------------------------
echo.
echo  Please Select a Game: 
echo.
echo  1. Game1
echo  2. Game2
echo  3. Return To MS-DOS
echo.
set /p gameerror= Your Current Selection: 
if %gameerror%==1 goto Game1
if %gameerror%==1. goto Game1
if %gameerror%==2 goto Game2
if %gameerror%==2. goto Game2
if %gameerror%==3 goto QUIT
if %gameerror%==3. goto QUIT
cls
goto INVALID
:Game1
cls
call A:\GAMES\Game1.exe
goto PROMPT
:Game2
cls
call A:\GAMES\Game2.exe
goto PROMPT
:QUIT
cls
echo.
echo  Are you sure you want to return to MS-DOS?
echo.
set /p quit= Confirmation: 
if %quit%==y goto DIE
if %quit%==Y goto DIE
if %quit%==yes goto DIE
if %quit%==Yes goto DIE
if %quit%==YES goto DIE
if %quit%==n goto PROMPT
if %quit%==N goto PROMPT
if %quit%==no goto PROMPT
if %quit%==No goto PROMPT
if %quit%==NO goto PROMPT
goto QUITERROR
:QUITERROR
cls
echo  * * * * * * * * * * * * * * * * * * * * * * * * * * *
echo  *                                                   *
echo  * ERROR:                                            *
echo  * ------                                            *
echo  * The choice you selected is wrong. Try Again!      *
echo  *                                                   *
echo  * * * * * * * * * * * * * * * * * * * * * * * * * * *
echo.
echo  Are you sure you want to return to MS-DOS?
echo.
set /p quiterror= Confirmation: 
if %quiterror%==y goto DIE
if %quiterror%==Y goto DIE
if %quiterror%==yes goto DIE
if %quiterror%==Yes goto DIE
if %quiterror%==YES goto DIE
if %quiterror%==n goto PROMPT
if %quiterror%==N goto PROMPT
if %quiterror%==no goto PROMPT
if %quiterror%==No goto PROMPT
if %quiterror%==NO goto PROMPT
goto QUITERROR
:DIE
cls
echo.
echo  Returning to MS-DOS...
4

2 回答 2

4

AFAIR - 很久以前 - SET /P 是 NT-only。

于 2013-03-08T05:21:43.080 回答
1

首先使用 VER 来检测操作系统,通过管道输出到 FIND(不是 findstr)并寻找“重要字符串”。这只需要做一次 - 所以把它直接放在@ECHO OFF

set running=NT
ver|find "1998" >nul
if not errorlevel 1 set running=DOS

"1998" 是一个重要的字符串,它应该只出现在 Win98 的 VER 中。其他要查找的值是“2222”(W98SE)和“3000”(WinME) - 因此只需为您需要检测的字符串重复行对。

当你想接受输入时,你需要使用 SET/P 用于 NT 或 CHOICE 用于 DOS

if %running%=NT set /p ....&goto :ntxxx :: else running DOS 选择 ...

其中标签 NTXXX 是您对 NT 输入的处理(例如,您似乎允许“2”或“2.”)

CHOICE 命令对击键作出反应并根据使用的击键设置 ERRORLEVEL。CHOICE/?将显示语法。既然IF ERRORLEVEL xx意味着"If errorlevel is xx OR GREATER"那么有必要处理以 REVERSE 顺序做出的选择(最后位置=最高 ERRORLEVEL 首先)

(我再也无法轻松访问 pre-XP 系统,所以以上所有内容均来自记忆)

有趣的是,CHOICE 再次出现在 Vista 中……

于 2013-03-09T16:17:16.533 回答