我使用 Mod Organizer 2 (mo2
) 玩
Fallout 4 VR,大多数 mod 都需要
*Fallout4_VR.esm
位于文件顶部
plugins.txt
,但mo2
不断删除它。
所以我下载了一个批处理文件,该文件在执行时在文件顶部添加了该行。
但问题是
mo2
在顶部有这个:
# This file was automatically generated by Mod Organizer.
*DLCRobot.esm
*DLCworks...
etc.
这是批处理文件中的代码:
@echo off
cls
setlocal enabledelayedexpansion
TITLE FO4VR Launch Codes
REM Find plugins.txt
set "file=C:\Modding\MO2\profiles\Default\plugins.txt"
if not exist "%file%" (
echo ERROR - Could not find %file%
echo.
goto FAIL
) else (
findstr /b /l /i /n "*Fallout4_VR.esm" %file%
if !errorlevel! == 0 (
echo VR ESM entry already exists. Good to go.
echo.
) else (
REM needs to add
(echo *Fallout4_VR.esm) >plugins.txt.new
type %file% >>plugins.txt.new
move /y plugins.txt.new %file%
echo VR ESM entry prepended to %file%.
echo.
)
)
echo.
pause
我需要编辑什么,以便
*Fallout4_VR.esm
位于整行下方,generated by Mod Organizer
而不是文件顶部?
文件
plugins.txt
最后应该是:
# This file was automatically generated by Mod Organizer.
*Fallout4_VR.esm
*DLCRobot.esm
*DLCworks...
etc.
将带有
*Fallout4_VR.esm
的行添加到注释行下方的文件 plugins.txt
的内容的任务可以使用以下代码完成:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
cls
title FO4VR Launch Codes
rem Find plugins.txt
set "PluginsFile=C:\Modding\MO2\profiles\Default\plugins.txt"
rem Use the line below instead of the line above if the file
rem plugins.txt is always in the same directory as the batch file.
rem set "PluginsFile=%~dp0plugins.txt"
if not exist "%PluginsFile%" echo ERROR: Could not find: "%PluginsFile%"& goto EndBatch
%SystemRoot%\System32\findstr.exe /B /I /L /C:"*Fallout4_VR.esm" "%PluginsFile%" >nul
if not errorlevel 1 echo VR ESM entry already exists. Good to go.& goto EndBatch
set "LineInsert=1"
(for /F usebackq^ delims^=^ eol^= %%I in ("%PluginsFile%") do (
if defined LineInsert (
set "CommentLine=1"
for /F "eol=#" %%J in ("%%~I") do set "CommentLine="
if not defined CommentLine (
echo *Fallout4_VR.esm
set "LineInsert="
)
echo(%%I
) else echo(%%I
))>"%PluginsFile%.tmp"
if not exist "%PluginsFile%.tmp" echo ERROR: Could not create temporary file: "%PluginsFile%.tmp"& goto EndBatch
%SystemRoot%\System32\attrib.exe -r "%PluginsFile%"
move /Y "%PluginsFile%.tmp" "%PluginsFile%" >nul 2>nul
if not errorlevel 1 echo VR ESM entry added to: "%PluginsFile%"& goto EndBatch
del "%PluginsFile%.tmp"
echo ERROR: Could not update: "%PluginsFile%"
:EndBatch
echo(
if /I not "%~1" == "/N" pause
endlocal
注意: 结果仅在以下情况下正确:
plugins.txt
不是 编码为 UTF-16 的 Unicode 编码文本文件建议避免以
(
开头并以匹配的 )
结尾的命令块,因为这样可以在不使用延迟变量扩展的情况下完成任务,因此批处理文件也可以使用存储在路径类似于 plugins.txt
的目录。当然需要使用命令块来进行C:\Temp\Development & Test(!) 100%
循环处理文本文件中的行进行修改。外部 FOR 循环处理文本文件中的行,跳过空行并将每个非空行完全分配给指定的循环变量 for /F
。选项
I
指示 FOR将双引号中的字符串解释为要处理的行的文件名,而不是要处理的字符串。选项
usebackq
定义一个空的分隔符列表,以防止在普通空格和水平制表符上分割行。选项 delims=
不定义任何字符作为行尾字符。在这种特殊情况下,必须使用在三个选项周围没有 eol=
的不寻常语法,这需要使用脱字符号 "
转义空格和等号,以将 ^
解释为具有命令 的三个选项的一个参数字符串为了。 只要不输出带有
usebackq delims= eol=
的行,第一个 IF 条件就为真。在这种情况下,首先定义环境变量
*Fallout4_VR.esm
,其值本身并不重要。内部 CommentLine
将当前行处理为字符串,并忽略零个或多个前导空格/制表符后以
for /F
开头的行。因此,如果当前行是注释行,则执行内部#
后,环境变量CommentLine
仍然被定义,而当前行删除的环境变量不是注释行。如果当前行不是注释行,则会有输出 for /F
将该行作为行插入到临时文件中,并且在任何情况下当前行输出下一个之前,都会删除环境变量
*Fallout4_VR.esm
。文本文件的所有其他行在插入由环境变量LineInsert
检测到的
*Fallout4_VR.esm
不再存在的行后才输出。执行外部 FOR 循环期间的所有输出均由 InsertLine
写入与要更新的文本文件位于同一目录中的临时文件,只要该目录对用户没有写保护或者存在已经是一个具有临时文件名称的目录(非常不可能)或具有该名称的只读文件(也非常不可能)。
接下来,临时文件将移动到现有文件上进行更新,这可能会失败,例如对文件的写访问被拒绝,因为该文件当前由拒绝共享文件写访问的应用程序打开。
可以使用选项
cmd.exe
启动批处理文件,以避免在批处理文件末尾使用命令
/N
提示用户。要了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。
pause
attrib /?
call /?
... 参数 0 的驱动器和路径 ... 批处理文件路径%~dp0
cls /?
copy /?
del /?
echo /?
endlocal /?
findstr /?
for /?
goto /?
if /?
move /?
pause /?
rem /?
set /?
setlocal /?
DosTips 论坛主题: