批量 - 编辑文件中的单行

Batch - edit single line in file

我正在搜索一个批处理脚本,它可以编辑另一个批处理文件中特定的已知行。 我找到了这个解决方案 (Whosebug: Batch - edit specified line in text file),它几乎可以正常工作。我对 Endoro 脚本的唯一问题是它删除了我不想编辑的行开头的冒号。有没有办法避免这种情况发生? 帮助将不胜感激!提前致谢!

@ECHO OFF &SETLOCAL

:Input  
    set /p version=Please Enter Version: 


:Replacement
    SET "file=test.bat"
    SET /a Line#ToSearch=4
    SET "Replacement=set jversion = %Version%_x86"

(FOR /f "tokens=1*delims=: " %%a IN ('findstr /n "^" "%file%"') DO (
        SET "Line=%%b"
        IF %%a equ %Line#ToSearch% SET "Line=%Replacement%"
        SETLOCAL ENABLEDELAYEDEXPANSION
        ECHO(!Line!
        ENDLOCAL
    ))>"%file%.new"
TYPE "%file%.new"
MOVE "%file%.new" "%file%"

for /F 将后续分隔符视为一个分隔符。 findstr /N 在每行前面加上行号和冒号。例如,如果第三行是 :abcd effor /F 接收 3::abcd ef。解析完这两个token后,你会得到3abcd ef。这就是前导冒号消失的原因。

为了克服这个问题,使用子字符串替换语法;假设变量 Line 包含整行,包括行号前缀(上面的字符串 3::abcd ef),使用 SET "Line=!Line:*:=!" 删除包括第一个冒号在内的所有内容(因此结果字符串是 :abcd ef).

要获取行号,请使用另一个 for /F 循环,以 : 作为分隔符,仅获取第一个标记。

固定脚本如下:

@ECHO OFF &SETLOCAL

:Input
    set /p version=Please Enter Version: 


:Replacement
    SET "file=test.bat"
    SET /a Line#ToSearch=4
    SET "Replacement=set jversion = %Version%_x86"

(FOR /f "delims=" %%a IN ('findstr /n "^" "%file%"') DO (
        SET "Line=%%a"
        rem // Use a `for /F` loop to extract the line number:
        for /F "delims=:" %%N in ("%%a") do set "LNum=%%N"
        SETLOCAL ENABLEDELAYEDEXPANSION
        rem // Use sub-string replacement to split off
        rem // the preceding line number and one colon:
        SET "Line=!Line:*:=!"
        IF !LNum! equ %Line#ToSearch% SET "Line=%Replacement%"
        ECHO(!Line!
        ENDLOCAL
    ))>"%file%.new"
TYPE "%file%.new"
MOVE "%file%.new" "%file%"