批处理文件以删除柯南流放中的开始视频DefaultGame.ini

问题描述

@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%"

也就是说,如果找到字符串,则将其替换;否则,请反流。