如何在文本文件的第一行之后插入一行?

问题描述 投票:0回答:1

我使用 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.
batch-file txt
1个回答
0
投票

将带有

*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 编码文本文件
  • 并且具有 DOS/Windows 行结尾(回车+换行)。

建议避免以

(
开头并以匹配的
)
结尾的命令块,因为这样可以在不使用延迟变量扩展的情况下完成任务,因此批处理文件也可以使用存储在路径类似于
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 论坛主题:
    ECHO。无法给出文本或空行 - 而是使用 ECHO/
  • 有关
  • 使用命令重定向运算符
  • 的 Microsoft 文档
  • 使用 Windows 批处理文件的单行多个命令
© www.soinside.com 2019 - 2024. All rights reserved.