Вывод объединенного текстового файла из одной команды ECHO приводит к тому, что символы вставляются в строку, напечатанную во второй раз после ожидаемого вывода - PullRequest
0 голосов
/ 27 января 2019

Я пытаюсь создать пакетный файл, чтобы вставить строку из файла .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

Где СерверX , СерверY , AltSaveDirectoryNamen и все три Порт настройки уникальны для каждого сервера, поэтому они должны остаться без изменений.

Мне нужно добавить еще несколько настроек из другого файла .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???????INSERT?????

Это ожидаемый результат, но с неожиданным повторным добавлением каждого символа в команде ECHO , которая не указала переменную в конце вывода (вэтот случай ??????? INSERT ????? ), сразу после выхода .

Я в тупике ... Надеюсь, кто-тоесть представление, что я делаю здесь не так.

1 Ответ

0 голосов
/ 29 января 2019

Хорошо, я применил идею, предоставленную 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
    )
)

Теперь он работает точно так, как задумано.

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

Я благодарю вас за вашу помощь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...