Пакетный файл для удаления начальных видеороликов в Conan Exiles DefaultGame.ini

#batch-file #ini

#пакетный файл #ini

Вопрос:

 @echo OFF
setlocal EnableExtensions DisableDelayedExpansion
set "FileName=F:Program Files(x86)SteamLibrarysteamappscommonConan ExilesConanSandboxConfigDefaultGame.ini"
set "TempFile=%TEMP%%~n0.tmp"
if not exist "%FileName%" goto EndBatch

del "%TempFile%" 2>nul

for /F delims^=^ eol^= %%A in ('%SystemRoot%System32findstr.exe /N "^" "%FileName%"') do (
    set "Line=%%A"
    setlocal EnableDelayedExpansion
    if not "!Line: StartupMovies=StartupUE4!" == "!Line!" (
    echo -StartupMovies=StartupUE4
    ) else if not "!Line: StartupMovies=StartupNvidia!" == "!Line!" (
    echo -StartupMovies=StartupNvidia
    ) else if not "!Line: StartupMovies=CinematicIntroV2!" == "!Line!" (
        echo -StartupMovies=CinematicIntroV2
    ) else echo(!Line:*:=!
    endlocal
) >>"%TempFile%"

rem Is the temporary file not binary equal the existing INI file, then move
rem the temporary file over existing INI file and delete the temporary file
rem if that fails like on INI file currently opened by an application with
rem no shared write access. Delete the temporary file if it is binary equal
rem the existing INI file because of nothing really changed.

%SystemRoot%System32fc.exe /B "%TempFile%" "%FileName%" >nul
if errorlevel 1 (
    move /Y "%TempFile%" "%FileName%"
    if errorlevel 1 del "%TempFile%"
) else del "%TempFile%"

:EndBatch
endlocal
  

С чего он начинается в этом ini-файле

 [/Script/MoviePlayer.MoviePlayerSettings]
bWaitForMoviesToComplete=True
bMoviesAreSkippable=True
-StartupMovies=
 StartupMovies=StartupUE4
 StartupMovies=StartupNvidia
 StartupMovies=CinematicIntroV2
  

Что я хочу, чтобы он делал

 [/Script/MoviePlayer.MoviePlayerSettings]
bWaitForMoviesToComplete=True
bMoviesAreSkippable=True
-StartupMovies=
-StartupMovies=StartupUE4
-StartupMovies=StartupNvidia
-StartupMovies=CinematicIntroV2
  

Что он на самом деле делает

 [/Script/MoviePlayer.MoviePlayerSettings]
bWaitForMoviesToComplete=True
bMoviesAreSkippable=True
-StartupMovies=
-StartupMovies=StartupUE4
-StartupMovies=StartupUE4
-StartupMovies=StartupUE4
  

Я и мой приятель немного занимались этим, это настолько близко, насколько мы приблизились к тому, чтобы даже отдаленно приблизиться, до этого мы повторяли и заменяли весь ini-файл и повторяли в цикле, теперь у нас просто возникают проблемы с правильной работой кода и заменой всех строк, как мыхотите это
Есть идеи о том, как я могу это исправить?

Ответ №1:

Аааак! Вероятно, было бы проще, если бы вы избавились от if not ... else ... структуры. За вашими двойными негативами очень сложно следить. Что касается вашей проблемы, изучите :

 "!Line: StartupMovies=StartupUE4!" == "!Line!"
  

Это заменит любой StartupMovies in line на StartupUE4 и сравнит результат с исходным значением Line

Это означает, что любая строка, содержащая StartupMovies , будет проверяться FALSE . Вы используете a NOT в своем if тесте, поэтому echo -StartupMovies=StartupUE4 для любой строки, которая содержит StartupMovies .

Попробуйте это:

 ....
for /F "usebackq delims=" %%A in ("%FileName%") do (
    setlocal EnableDelayedExpansion
    set "Line=%%A"
    set "regurgitate=Y"
    if "!Line: StartupMovies=!" NEQ "!Line!" (
     rem a " StartupMovies" line
     for %%s in (StartupUE4 StartupNvidia CinematicIntroV2) do if "!Line:%%s=!" NEQ "!Line!" (
      echo -StartupMovies=%%s
      set "regurgitate="
     )
    )
    if defined regurgitate echo %%A
    endlocal
) >>"%TempFile%"

....
  

Поскольку filename он заключен в кавычки (как и должно быть, если предположить, что его содержимое может содержать пробелы), то usebackq модификатор сообщает пакету, что он должен обработать файл «%FileName%». delims= Присваивает всю строку %%A .

Для каждой строки — regurgitate set непустое значение. Определите требуемую общую строку, и если эта строка также содержит любую из трех строк, то echo -start... строка и установите значение regurgitate пустым

Если regurgitate процесс сохраняется, просто повторите исходную необработанную строку.

Теперь, если вы просто хотите изменить startup... на -startup... then, это немного короче:

 for /F "usebackq delims=" %%A in ("%FileName%") do (
    setlocal EnableDelayedExpansion
    set "Line=%%A"
    echo !Line: StartupMovies=-StartupMovies!
    endlocal
) >>"%TempFile%"
  

То есть, если строка найдена, замените ее; в противном случае, отрыгните ее.

Комментарии:

1. Хорошо, но я бы сделал сравнение так if /I "!Line:* StartupMovies=!"==" StartupMovies!Line!" , чтобы убедиться, что оно соответствует только началу строки; это можно даже сделать чувствительным к регистру, удалив /I , если необходимо…