【问题标题】:Batch File To Remove Starting Videos in Conan Exiles DefaultGame.ini在流放者柯南 DefaultGame.ini 中删除起始视频的批处理文件
【发布时间】:2026-01-14 21:40:02
【问题描述】:
@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 文件并循环重复,现在我们只是遇到了麻烦让代码正常工作并替换我们想要的所有行 关于我如何可能解决此问题的任何想法?

【问题讨论】:

    标签: batch-file ini


    【解决方案1】:

    啊啊啊!如果您摆脱 if not ... else ... 结构,可能会更容易。你的双重否定很难理解。 至于您的问题,请检查:

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

    这会将line 中的任何+StartupMovies 替换为StartupUE4,并将结果与​​Line 的原始值进行比较

    这意味着包含+StartupMovies任何 行将测试FALSE。您在 if 测试中使用了 NOT,因此以下 echo -StartupMovies=StartupUE4 将为包含 +StartupMoviesany 行执行。

    试试这个:

    ....
    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

    对于每一行,regurgitateset 到一个非空值。检测所需的公共字符串,如果该行还包含三个字符串中的任何一个,则echo-start... 行并将regurgitate 的值设置为empty

    如果regurgitate 在该过程中幸存下来,则只需回显原始未处理的行。

    现在,如果您只是想将 +startup... 更改为 -startup...,那么这会更短一些:

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

    即如果找到该字符串,则替换它;否则,反刍。

    【讨论】:

    • 很好,但我会像if /I "!Line:*+StartupMovies=!"=="+StartupMovies!Line!" 那样进行比较,以确保它只匹配一行的开头;如果需要,甚至可以通过删除 /I 来区分大小写……
    最近更新 更多