Batch file 需要输入附加文本行的.bat文件(半工作)

Batch file 需要输入附加文本行的.bat文件(半工作),batch-file,append,dosbox,Batch File,Append,Dosbox,前言:我创建批处理文件已经有一段时间了,这是我第一次使用这个网站,所以如果 我忽略或忘记做某事,只要指出它,我会解决它 今天我决定回到一些dos游戏中,我想制作一个批处理文件,让我可以附加三个 文本行,基本上是通常手动写入[autoexec]部分的mount->c:->.exe行 dosbox.conf的 经过一天的修补,我终于让批处理文件与一些游戏一起工作,魔兽争霸2/地下城主/大地传说, 我现在遇到的唯一问题是,代码对于上面提到的三个代码都可以正常工作,但对于其他代码则不行 甚至附加到dos

前言:我创建批处理文件已经有一段时间了,这是我第一次使用这个网站,所以如果 我忽略或忘记做某事,只要指出它,我会解决它

今天我决定回到一些dos游戏中,我想制作一个批处理文件,让我可以附加三个 文本行,基本上是通常手动写入[autoexec]部分的mount->c:->.exe行 dosbox.conf的

经过一天的修补,我终于让批处理文件与一些游戏一起工作,魔兽争霸2/地下城主/大地传说, 我现在遇到的唯一问题是,代码对于上面提到的三个代码都可以正常工作,但对于其他代码则不行 甚至附加到dosbox.conf

(在“调试”一段时间后,使用Warcraft 1) 我在'set/p input'之后,在war1的if语句中,也在war1标签的开头和结尾处,放置了pause命令。唯一触发的暂停是“set/p输入”处的暂停,因此代码要么忽略了If语句,要么我不知道自己在做什么

任何关于我做错了什么的指点都将不胜感激。 TL:DR代码适用于魔兽争霸2(输入w)、知识之地(输入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

如果从命令提示符下运行脚本,而不是双击它,则会看到出现“命令语法不正确”错误

这是因为除了《魔兽争霸2》、《地下城大师》和《知识之地》之外,你的每个
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
)
您还可以通过将
goto
s与
if
s放在同一行(不带括号)来避免这种情况

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

在输入值后面的双引号和不起作用的行中的开括号之间缺少空格

不过,我建议进行此更改,以便更容易管理代码

对重复的条目使用变量,并循环返回到Ask以及退出选项

@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"

我看到的一个问题是
ECHO mount c f:\DOSGames\dun2 \-label Dune 2>>…
这里的2具有特殊意义。当它出现在
>
之前时,它意味着“将标准错误流附加到给定的文件中”.Oooo这是一个巨大的derp,返回并在2和>>之间放置了一个空格,但如果这仍然会导致问题,我可以始终将2切换为罗马数字。这个空格应该可以解决这个特殊问题。您可能还有其他我无法发现的问题。没错,我现在已经完成了所有的附加操作。尽管我会保存in-depth“debugging”用于明天。呵呵,我正在添加我的.conf清理程序(这是一个批处理文件,在我想玩另一个游戏的时候,它会保存一个干净版本的配置文件。我最终计划添加更精细的细节,但现在它可以工作了,我真的不想开始编辑它,然后产生另一个问题。刚刚看到你的最后一条评论..xD是的,我在复制/粘贴代码,然后填充特定的内容。)s一定会用精梳的刷子仔细检查