#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
, если необходимо…