从单个ECHO命令输出的连接文本文件在预期输出后第二次将字符插入到字符串中

问题描述 投票:0回答:1

我正在尝试创建一个批处理文件,以便从.txt文件中的一个字符串中插入225个批处理文件中的字符串中的字符串 - 即插入到特定位置的文件中的一行 - 但是这个问题涉及插入部分,而不是循环部分,所以我在我的代码示例中省略了后者。它目前只是在屏幕上显示文字;实际上并没有把它写到文件中。

目标文件是一组用于使用工具运行游戏服务器集群的启动.bat文件,因此我将不得不使用与它们开头相同的名称(Start 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

ServerS,Server,AltSaveDirectoryNamen和所有三个端口设置对每个服务器都是唯一的,因此这些设置必须保持不变。

我需要在最终版本的另一个.txt文件中添加几个设置,但是对于这个例子,我只是将添加内容(在ReservedPlayerSlots设置之后添加INSERT一词,同时将每个设置除以问号)直接添加到此脚本。

我的代码实际上完全按照我的意愿行事,但遗憾的是它并没有停止在那一点上,而是决定追加更多的文字而不是我想要的;具体来说,我添加到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 ?????) ,退出后。

我很难过......我希望有人知道我在这里做错了什么。

batch-file cmd
1个回答
0
投票

好吧,我应用了aschipfl提供的想法,它现在似乎有效。

IF NOT "%%b"==""线似乎完成了这个技巧,在我使用另一个ECHO添加了最后一行的出口。我的完整脚本(包括循环和写入文件)现在是这样的:

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

现在这完全符合预期。

很可能有一种更优雅的方式来做这件事,而且我认为有一种方法可以使这种方式更加通用且不那么硬编码,但这对我的目的来说已经足够了。

谢谢你的帮助!

© www.soinside.com 2019 - 2024. All rights reserved.