нужен ввод для файла .bat, добавляющего строки текста (полурабочие)

Предисловие: прошло некоторое время с тех пор, как я создал пакетный файл, и я впервые использую этот сайт, поэтому, если я что-то упустил или забыл сделать, просто укажите на это, и я это исправлю.

Сегодня я решил вернуться к некоторым играм для DOS, и я хотел создать пакетный файл, который позволил бы мне добавить три строки текста, в основном строки mount->c:->.exe, которые вы обычно пишете вручную, к [autoexec ] раздел dosbox.conf.

После дня возни я, наконец, получил пакетный файл для работы с несколькими играми, warcraft2/DungeonMaster/LandsofLore, единственная проблема, с которой я столкнулся, заключается в том, что код отлично работает для трех упомянутых выше, но не для других. даже добавить в dosbox.conf.

(после небольшой «отладки» использовал warcraft1) Я поместил команды паузы после «set/p input» и в операторе if для war1 также в метке war1, в начале и в конце. единственная пауза, которая срабатывает, - это пауза при вводе set/p, поэтому код либо пропускает операторы If, либо я не знаю, что делаю.

Любые указатели на то, что я сделал неправильно, будут оценены. Код TL:DR работает для warcraft2 (ввод w), Lands of Lore (ввод l), мастера подземелий (ввод d), другие входы, похоже, либо завершаются сразу после ввода, либо отменяются до того, как он попадет в оператор IF.

 @echo off

REM ask is currently not used
:ask
REM asks for input
echo Which game would you like to play?
echo ___________________________________________________________________________________________
echo [w]arcraft 2 - w[a]rcraft1 - [c]ivilization - d[u]ne 2 - [d]ungeon master
echo [l]ands of lore - [o]regontrail - [s]im ant - Wol[f]3D 
echo -------------------------------------------------------------------------------------------

REM input variable
setlocal
SET /P INPUT=[]

REM check user input then go to selected game
IF /I "%INPUT%"=="w" (
    goto war2
)
IF /I "%INPUT%"=="d" (
    goto dungeon
)
IF /I "%INPUT%"=="l" (
    goto land
)
IF /I "%INPUT%"=="a"(
    goto war1
)
IF /I "%INPUT%"=="c"(
    goto civ
)
IF /I "%INPUT%"=="u"(
    goto dune2
)
IF /I "%INPUT%"=="o"(
    goto trail
)
IF /I "%INPUT%"=="s"(
    goto ant
)
IF /I "%INPUT%"=="f"(
    goto wolf
)

REM appends text to the end of dosbox.conf,after the [autoexec]
REM then starts dosbox and ends the file.
:war1
    ECHO mount -u c>>"F:\Programs\DOSBoxPortable\Data\settings\dosbox.conf"
    ECHO mount c f:\DOSGames\war1\  -label warcraft1>>"F:\Programs\DOSBoxPortable\Data\settings\dosbox.conf"
    ECHO c:>>"F:\Programs\DOSBoxPortable\Data\settings\dosbox.conf"
    ECHO WAR>>"F:\Programs\DOSBoxPortable\Data\settings\dosbox.conf"
 start F:\Programs\DOSBoxPortable\DOSBoxPortable.EXE
goto:EOF
:civ
    ECHO mount -u c>>"F:\Programs\DOSBoxPortable\Data\settings\dosbox.conf"
    ECHO mount c f:\DOSGames\civ\  -label Civ>>"F:\Programs\DOSBoxPortable\Data\settings\dosbox.conf"
    ECHO c:>>"F:\Programs\DOSBoxPortable\Data\settings\dosbox.conf"
    ECHO CIV>>"F:\Programs\DOSBoxPortable\Data\settings\dosbox.conf"
 start F:\Programs\DOSBoxPortable\DOSBoxPortable.EXE
goto:EOF
:dune2
    ECHO mount -u c>>"F:\Programs\DOSBoxPortable\Data\settings\dosbox.conf"
    ECHO mount c f:\DOSGames\dun2\  -label Dune 2>>"F:\Programs\DOSBoxPortable\Data\settings\dosbox.conf"
    ECHO c:>>"F:\Programs\DOSBoxPortable\Data\settings\dosbox.conf"
    ECHO DUNE2>>"F:\Programs\DOSBoxPortable\Data\settings\dosbox.conf"
 start F:\Programs\DOSBoxPortable\DOSBoxPortable.EXE
goto:EOF
:trail
    ECHO mount -u c>>"F:\Programs\DOSBoxPortable\Data\settings\dosbox.conf"
    ECHO mount c f:\DOSGames\oregontrail\  -label Oregon Trail>>"F:\Programs\DOSBoxPortable\Data\settings\dosbox.conf"
    ECHO c:>>"F:\Programs\DOSBoxPortable\Data\settings\dosbox.conf"
    ECHO OREGON>>"F:\Programs\DOSBoxPortable\Data\settings\dosbox.conf"
 start F:\Programs\DOSBoxPortable\DOSBoxPortable.EXE
goto:EOF
:ant
    ECHO mount -u c>>"F:\Programs\DOSBoxPortable\Data\settings\dosbox.conf"
    ECHO mount c f:\DOSGames\simant\  -label Sim Ant>>"F:\Programs\DOSBoxPortable\Data\settings\dosbox.conf"
    ECHO c:>>"F:\Programs\DOSBoxPortable\Data\settings\dosbox.conf"
    ECHO SIMANT>>"F:\Programs\DOSBoxPortable\Data\settings\dosbox.conf"
 start F:\Programs\DOSBoxPortable\DOSBoxPortable.EXE
goto:EOF
:wolf
    ECHO mount -u c>>"F:\Programs\DOSBoxPortable\Data\settings\dosbox.conf"
    ECHO mount c f:\DOSGames\WOLF3D\  -label Oregon Trail>>"F:\Programs\DOSBoxPortable\Data\settings\dosbox.conf"
    ECHO c:>>"F:\Programs\DOSBoxPortable\Data\settings\dosbox.conf"
    ECHO WOLFD3D>>"F:\Programs\DOSBoxPortable\Data\settings\dosbox.conf"
 start F:\Programs\DOSBoxPortable\DOSBoxPortable.EXE
goto:EOF
:war2
    ECHO mount -u c>>"F:\Programs\DOSBoxPortable\Data\settings\dosbox.conf"
    ECHO mount c f:\DOSGames\war2\war2\  -label warcraft2>>"F:\Programs\DOSBoxPortable\Data\settings\dosbox.conf"
    ECHO c:>>"F:\Programs\DOSBoxPortable\Data\settings\dosbox.conf"
    ECHO war2>>"F:\Programs\DOSBoxPortable\Data\settings\dosbox.conf"
 start F:\Programs\DOSBoxPortable\DOSBoxPortable.EXE
goto:EOF
:dungeon
    ECHO mount -u c>>"F:\Programs\DOSBoxPortable\Data\settings\dosbox.conf" 
    ECHO mount c f:\DOSGames\DungeonMaster\ -t cdrom -label DungeonMaster>>"F:\Programs\DOSBoxPortable\Data\settings\dosbox.conf"
    ECHO c:>>"F:\Programs\DOSBoxPortable\Data\settings\dosbox.conf"
    ECHO dm>>"F:\Programs\DOSBoxPortable\Data\settings\dosbox.conf"
 start F:\Programs\DOSBoxPortable\DOSBoxPortable.EXE
goto:EOF
:land   
    ECHO mount -u c>>"F:\Programs\DOSBoxPortable\Data\settings\dosbox.conf"
    ECHO mount c f:\DOSGames\LoL\ -label lands>>"F:\Programs\DOSBoxPortable\Data\settings\dosbox.conf"
    ECHO c:>>"F:\Programs\DOSBoxPortable\Data\settings\dosbox.conf"
    ECHO lands>>"F:\Programs\DOSBoxPortable\Data\settings\dosbox.conf"
 start F:\Programs\DOSBoxPortable\DOSBoxPortable.EXE

person Ravkrat    schedule 09.01.2016    source источник
comment
Одна проблема, которую я вижу, заключается в том, что с ECHO mount c f:\DOSGames\dun2\ -label Dune 2>>... здесь 2 имеет особое значение. Когда он появляется непосредственно перед >>, это означает добавление стандартного потока ошибок к данному файлу.   -  person Klitos Kyriacou    schedule 09.01.2016
comment
Оооо, это огромный сумасшедший, вернулся и поставил пробел между 2 и ›› хотя, если это все еще вызовет проблемы, я всегда могу переключить 2 на римские цифры.   -  person Ravkrat    schedule 09.01.2016
comment
Пространство должно решить эту конкретную проблему. Возможно, у вас есть другие проблемы, которые я не смог обнаружить.   -  person Klitos Kyriacou    schedule 09.01.2016
comment
правда, теперь у меня все работает. хотя я приберегу углубленную «отладку» на завтра.   -  person Ravkrat    schedule 09.01.2016


Ответы (2)


Если вы запустите скрипт из командной строки, а не дважды щелкнете по нему, вы увидите, что получаете ошибку «Неверный синтаксис команды».

Это связано с тем, что вам не хватает пробела перед ( в каждом из ваших утверждений if, за исключением тех, которые относятся к Warcraft 2, Dungeon Master и Lands of Lore.

IF /I "%INPUT%"=="w" (
    goto war2
)
IF /I "%INPUT%"=="d" (
    goto dungeon
)
IF /I "%INPUT%"=="l" (
    goto land
)
IF /I "%INPUT%"=="a" (
    goto war1
)
IF /I "%INPUT%"=="c" (
    goto civ
)
IF /I "%INPUT%"=="u" (
    goto dune2
)
IF /I "%INPUT%"=="o" (
    goto trail
)
IF /I "%INPUT%"=="s" (
    goto ant
)
IF /I "%INPUT%"=="f" (
    goto wolf
)

Вы также могли бы избежать этого, поместив goto в ту же строку, что и if без круглых скобок.

IF /I "%INPUT%"=="w" goto war2
IF /I "%INPUT%"=="d" goto dungeon
IF /I "%INPUT%"=="l" goto land
IF /I "%INPUT%"=="a" goto war1
IF /I "%INPUT%"=="c" goto civ
IF /I "%INPUT%"=="u" goto dune2
IF /I "%INPUT%"=="o" goto trail
IF /I "%INPUT%"=="s" goto ant
IF /I "%INPUT%"=="f" goto wolf
person SomethingDark    schedule 09.01.2016

Вам не хватает пробела между входным значением, завершающим двойную кавычку, и открывающей скобкой в ​​строках, которые не работают.

Однако я бы предложил это изменение, чтобы упростить управление кодом.

Используйте переменные для повторяющихся записей и создайте цикл, чтобы вернуться к опции «Спросить», а также к опции «Выход».

@echo off
setlocal

:: ask is currently not used
:ask
:: asks for input
cls
echo Which game would you like to play?
echo ___________________________________________________________________________________________
echo [w]arcraft 2 - w[a]rcraft1 - [c]ivilization - d[u]ne 2 - [d]ungeon master
echo [l]ands of lore - [o]regontrail - [s]im ant - Wol[f]3D  - [Q]uit
echo -------------------------------------------------------------------------------------------

:: input variable
SET /P INPUT=[]

IF /I "%INPUT%"=="q" then Exit

set DosBoxConf="F:\Programs\DOSBoxPortable\Data\settings\dosbox.conf"
set MountDrive=mount -u c
set MyDrive=C:

:: check user input then go to selected game
IF /I "%INPUT%"=="w" ( 
set MountCmd=mount c f:\DOSGames\war2\war2\  -label warcraft2
set RunCmd=WAR2
goto RunDosBox
) 
IF /I "%INPUT%"=="d" ( 
set MountCmd=mount c f:\DOSGames\DungeonMaster\ -t cdrom -label DungeonMaster
set RunCmd=DM
goto RunDosBox
) 
IF /I "%INPUT%"=="l" ( )
set MountCmd=mount c f:\DOSGames\LoL\ -label lands
set RunCmd=lands
goto RunDosBox
) 
IF /I "%INPUT%"=="a" ( 
set MountCmd=mount c f:\DOSGames\war1\  -label warcraft1
set RunCmd=WAR
goto RunDosBox
) 
IF /I "%INPUT%"=="c" ( 
set MountCmd=mount c f:\DOSGames\civ\  -label Civ
set RunCmd=CIV
goto RunDosBox
) 
IF /I "%INPUT%"=="u" ( 
set MountCmd=mount c f:\DOSGames\dun2\  -label Dune 2
set RunCmd=DUNE2
goto RunDosBox
) 
IF /I "%INPUT%"=="o" ( 
set MountCmd=mount c f:\DOSGames\oregontrail\  -label Oregon Trail
set RunCmd=OREGON
goto RunDosBox
) 
IF /I "%INPUT%"=="s" ( 
set MountCmd=mount c f:\DOSGames\simant\  -label Sim Ant
set RunCmd=SIMANT
goto RunDosBox
) 
IF /I "%INPUT%"=="f" ( 
set MountCmd=mount c f:\DOSGames\WOLF3D\  -label Wolf 3D
set RunCmd=WOLFD3D
goto RunDosBox
) 
:: back to ask if input didn't match a choice
goto ask

:RunDosBox
:: build the config and run DosBox
ECHO %MountDrive%>>%DosBoxConf%
ECHO %MountCmd%>>%DosBoxConf%
ECHO %MyDrive%>>%DosBoxConf%
ECHO %RunCmd%>>%DosBoxConf%
start F:\Programs\DOSBoxPortable\DOSBoxPortable.EXE

Также обратите внимание, что эта строка в вашем коде имеет неверный тег для Oregon Trail, но раздел предназначен для Wolf3D.

ECHO mount c f:\DOSGames\WOLF3D\  -label Oregon Trail>>"F:\Programs\DOSBoxPortable\Data\settings\dosbox.conf"
person RLH    schedule 09.01.2016
comment
хех, я добавлял в свой очиститель .conf (пакетный файл, который сохраняет чистую версию conf поверх используемой conf, когда я хочу играть в другую игру. В конечном итоге я планирую добавить более мелкие детали, но пока это работает и я действительно не хочу начинать редактировать его, а затем создавать еще одну проблему. только что увидел ваш последний комментарий.. xD да, я копировал / вставлял код, затем заполнение специфики определенно пройдет по нему тонкой расчесанной кистью - person Ravkrat; 09.01.2016