我正在尝试创建一个批处理文件,以将 .txt 文件中的字符串插入到225个批处理文件中字符串的特定位置-即,插入到文件中的一行一个特定的位置-但是这个问题涉及插入部分,而不是循环部分,因此我在代码示例中省略了后者。目前,它也只是在屏幕上显示文本。实际上没有将其写入文件。
目标文件是一堆用于使用工具运行游戏服务器群集的启动 .bat 文件,因此,我必须将每个文件都保留以与它们开头相同的名称( 启动XXYY.bat )。它们包含以下内容:
start /high ShooterGame\Binaries\Win64\ShooterGameServer.exe Ocean?ServerX=0?ServerY=0?AltSaveDirectoryName=0000?ServerAdminPassword=1234?MaxPlayers=50?ReservedPlayerSlots=25?QueryPort=50002?Port=5002?SeamlessIP=192.168.1.225?RCONEnabled=true?RCONPort=28450 -log -server -NoBattlEye
exit
ServerX , ServerY , AltSaveDirectoryNamen 和所有三个 Port 设置对于每个服务器都是唯一的,因此这些将必须保持不变。
我需要从最终版本中的另一个 .txt 文件中添加更多设置,但在本示例中,我将添加其他内容(添加了 INSERT 在 ReservedPlayerSlots 设置之后,同时保持每个设置用问号分隔)。
我的代码实际上正在按照我想要的去做,但是不幸的是,它并没有就此止步,而是决定添加比我想要的更多的文本;具体来说,我添加到 ECHO 命令的所有内容都不是变量名。
为澄清起见,我得到了我想要的确切输出...再加上一堆不必要的问号和 INSERT 一词,这些显然来自我的 ECHO 命令,但我不知道为什么要重新添加它们。
我对批处理脚本的知识非常有限,因此我可能忽略了一些基本知识。
我尝试用普通字母代替输出中的问号(在最终版本中必须是问号),但这不会改变行为;它们仍然被附加到预期的输出中,就像它们取代了问号一样。
@ECHO OFF
SET FileNum=0000
REM I will have the code loop through 225 files (0000-1414) in the final version, but for test purposes I just set it to one single file number manually here.
SET FileName=Start %FileNum%.bat
REN "%FileName%" temp.txt
FOR /F "tokens=1,2,3,4,5,6,7,8,9,10,11,12 delims=?" %%a IN (temp.txt) DO (
ECHO %%a?%%b?%%c?%%d?%%e?%%f?%%g?INSERT?%%h?%%i?%%j?%%k?%%l
)
REN temp.txt "%FileName%"
我希望这段代码能够输出:
start /high ShooterGame\Binaries\Win64\ShooterGameServer.exe Ocean?ServerX=0?ServerY=0?AltSaveDirectoryName=0000?ServerAdminPassword=1234?MaxPlayers=50?ReservedPlayerSlots=25?INSERT?QueryPort=50002?Port=5002?SeamlessIP=192.168.1.225?RCONEnabled=true?RCONPort=28450 -log -server -NoBattlEye
exit
但是我得到的是这个
start /high ShooterGame\Binaries\Win64\ShooterGameServer.exe Ocean?ServerX=0?ServerY=0?AltSaveDirectoryName=0000?ServerAdminPassword=1234?MaxPlayers=50?ReservedPlayerSlots=25?INSERT?QueryPort=50002?Port=5002?SeamlessIP=192.168.1.225?RCONEnabled=true?RCONPort=28450 -log -server -NoBattlEye
exit???????INSERT?????
哪个是预期的输出,但在 ECHO 命令中意外地重新添加了每个符号,而这些符号未在输出末尾指定变量(在本例中为? ?????? INSERT ????? ),在退出之后。
我很困惑...我希望有人知道我在这里做错了什么。
答案 0 :(得分:0)
好的,我采用了aschipfl提供的想法,现在看来可以了。
在我使用另一个 ECHO 将 exit 添加到最后一行之后,IF NOT "%%b"==""
行似乎已经完成了。我的完整脚本(包括循环和写入文件)现在是这样的:
@ECHO OFF
SETLOCAL EnableDelayedExpansion
SET "Insert=SettingOne=True?SettingTwo=False?SettingThree=1.000000"
FOR /l %%x IN (0, 1, 14) DO (
FOR /l %%y IN (0, 1, 14) DO (
IF %%x LSS 10 (SET XNum=0%%x) ELSE (SET XNum=%%x)
IF %%y LSS 10 (SET YNum=0%%y) ELSE (SET Ynum=%%y)
SET "FileNum=!XNum!!YNum!"
SET "FileName=Start !FileNum!.bat"
ECHO Filename: !FileName!
REN "!FileName!" temp.txt
(
FOR /F "tokens=1-12 delims=?" %%a IN (temp.txt) DO (
IF NOT "%%b"=="" (
ECHO %%a?%%b?%%c?%%d?%%e?%%f?%%g?%Insert%?%%h?%%i?%%j?%%k?%%l
ECHO exit
)
)
) >edited.txt
REN edited.txt "!FileName!"
DEL /q temp.txt
ECHO has been updated
)
)
现在它完全可以正常工作了。
很有可能有一种更优雅的方式来做到这一点,而且我认为有一种方法可以使这种方式更加通用和更少的硬编码,但是对于我的目的来说已经足够了。
感谢您的帮助!