批量 - 编辑文件中的单行
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 ef
,for /F
接收 3::abcd ef
。解析完这两个token后,你会得到3
和abcd 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%"
我正在搜索一个批处理脚本,它可以编辑另一个批处理文件中特定的已知行。 我找到了这个解决方案 (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 ef
,for /F
接收 3::abcd ef
。解析完这两个token后,你会得到3
和abcd 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%"