.bat在基于NT的Windows但不是DOS或9x工作?

时间:2013-03-08 04:41:39

标签: batch-file windows-xp cmd dos windows-98

我为传统DOS系统编写了一个批处理文件,用于不在Win32上运行的游戏。代码在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...

2 个答案:

答案 0 :(得分:4)

AFAIR - 很久以前 - SET / P仅限NT。

答案 1 :(得分:1)

首先使用VER来检测操作系统,方法是将输出传递给FIND(不是findtr)并查找“重要字符串”。这只需要进行一次 - 因此请将其放在@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

如果%running%= NT set / p ....& goto:ntxxx ::运行DOS 选择......

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

CHOICE命令对击键做出反应,并根据所使用的击键设置ERRORLEVEL。 CHOICE/?将显示语法。 由于IF ERRORLEVEL xx表示"If errorlevel is xx OR GREATER",因此必须处理以REVERSE顺序进行的选择(最后一个位置=最高ERRORLEVEL优先)

(我不再能够轻松访问XP之前的系统,因此以上所有内容均来自内存)

有趣的是,CHOICE重新出现在Vista ......