问题描述
@echo OFF
setlocal EnableExtensions disableDelayedExpansion
set "FileName=F:\Program Files(x86)\SteamLibrary\steamapps\common\Conan Exiles\ConanSandBox\Config\DefaultGame.ini"
set "TempFile=%TEMP%\%~n0.tmp"
if not exist "%FileName%" goto EndBatch
del "%TempFile%" 2>nul
for /F delims^=^ eol^= %%A in ('%systemRoot%\System32\findstr.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%\System32\fc.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文件并循环重复之前,我们已经变得越来越近了一样,现在我们遇到了麻烦使代码正常工作并替换我们想要的所有行 关于如何解决此问题的任何想法?
解决方法
Aaaak!如果您摆脱了if not ... else ...
结构,可能会更容易。您的双重否定词很难理解。
至于您的问题,请检查:
"!Line:+StartupMovies=StartupUE4!" == "!Line!"
这会将+StartupMovies
中的任何line
替换为StartupUE4
,并将结果与Line
的原始值进行比较
这意味着包含+StartupMovies
的任何行将测试FALSE
。您在NOT
测试中使用if
,因此对包含echo -StartupMovies=StartupUE4
的 any 行执行以下+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
修饰符告诉批处理它要处理文件“ %文档名称%”。 delims=
将整行分配给%%A
。
对于每一行,regurgitate
均为set
,为非空值。检测所需的公用字符串,如果该行还包含三个字符串中的任何一个,则echo
-start...
行并将regurgitate
的值设置为空
如果regurgitate
在此过程中仍然存在,则只需回显原始未处理的行即可。
现在,如果您只是想将+startup...
更改为-startup...
,那么这要短一些:
for /F "usebackq delims=" %%A in ("%FileName%") do (
setlocal EnableDelayedExpansion
set "Line=%%A"
echo !Line:+StartupMovies=-StartupMovies!
endlocal
) >>"%TempFile%"
也就是说,如果找到字符串,则将其替换;否则,请反流。