.bat работает в Windows на базе NT, но не в DOS или 9x?

Я написал командный файл для устаревшей системы 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 ответа

Решение

Сначала используйте VER для обнаружения ОС, передавая выходные данные в FIND (не findstr) и ища "значимую строку". Это нужно сделать только один раз, поэтому поместите его сразу после @ECHO OFF

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

"1998" - это важная строка, которая должна появляться только в VER для Win98. Другие допустимые значения: "2222" (W98SE) и "3000" (WinME), поэтому просто повторите пару строк для строк, которые необходимо обнаружить.

Если вы хотите принять ввод, вам нужно использовать SET/P для NT или CHOICE для DOS

если%running%=NT set /p ....&goto:ntxxx:: else работает выбор DOS...

где метка NTXXX - это ваша обработка для NT-ввода (например, вы разрешаете "2" или "2")

Команда CHOICE реагирует на нажатие клавиши и устанавливает значение ERRORLEVEL в зависимости от используемого нажатия клавиши. CHOICE/? покажет синтаксис. поскольку IF ERRORLEVEL xx средства "If errorlevel is xx OR GREATER" затем необходимо обработать выбор, сделанный в порядке REVERSE (последняя позиция = сначала наивысшая ОШИБКА)

(У меня больше нет свободного доступа к системе до XP, так что все вышеизложенное происходит из памяти)

Интересно, что CHOICE вновь появился с Vista...

AFAIR - и это давно - SET /P только для NT.

Другие вопросы по тегам