这是否可以使用 .batch 文件修改同一文件中的多个变量,而不会影响空格、特殊字符等其他内容?



我有一个文件修订版.ini有多个变量要更新:

s1=10
s2=20
s3=30

在这里,我使用单独的循环来查找文件中的字符串。 同一文件运行循环 3 次。是否可以在同一循环中找到这三个字符串?

@Echo Off
cd /d D:xyz
setlocal enabledelayedexpansion
set s1=10
set s2=11
set s3=12
set "file=rev.ini"
for /F "tokens=1,* delims==" %%i in ('findstr "s1= "  rev.ini') do (
set "versionVar=%%~i"
set "versionVal=%%~j"
set sequence=%s1%
)
for /f "tokens=1,*delims=]" %%i in ('type "%file%" ^| find /v /n "" ^& break^>%file%') do (
set "line=%%j"
if "!line!" == "!versionVar!=!versionVal!" set line=!versionVar!=!sequence!
echo(!line!>>!file!
)

for /F "tokens=1,* delims==" %%i in ('findstr "s2= " rev.ini') do (
set "versionVar=%%~i"
set "versionVal=%%~j"
set sequence=%s2%
)
for /f "tokens=1,*delims=]" %%i in ('type "%file%" ^| find /v /n "" ^& break^>%file%') do (
set "line=%%j"
if "!line!" == "!versionVar!=!versionVal!" set line=!versionVar!=!sequence!
echo(!line!>>!file!
)
for /F "tokens=1,* delims==" %%i in ('findstr "s3= "  rev.ini') do (
set "versionVar=%%~i"
set "versionVal=%%~j"
set sequence=%s3%
)
for /f "tokens=1,*delims=]" %%i in ('type "%file%" ^| find /v /n "" ^& break^>%file%') do (
set "line=%%j"
if "!line!" == "!versionVar!=!versionVal!" set line=!versionVar!=!sequence!
echo(!line!>>!file!
)

Goto :EOF
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
rem The following settings for the source directory and filename are names
rem that I use for testing and deliberately include names which include spaces to make sure
rem that the process works using such names. These will need to be changed to suit your situation.
SET "sourcedir=u:your files"
SET "filename1=%sourcedir%q74276740.txt"
SET "outfile=outfile.txt"
set "s1=10"
set "s2=11"
set "s3=12"

REM (
FOR /f "usebackqtokens=1*delims==" %%b IN ("%filename1%") DO (
SET "#keep=Y"
FOR /f "tokens=1*delims==" %%u IN ('set') DO (IF /i "%%b"=="%%u" SET "#keep="&ECHO %%b=%%v)
IF DEFINED #keep IF "%%c"=="" (ECHO %%b) ELSE (ECHO %%b=%%c)
)
REM )>"%outfile%"
GOTO :EOF

在应用于实际数据之前,请始终根据测试目录进行验证。

请注意,如果文件名不包含空格等分隔符,则可以省略usebackq和引号%filename1%

只需阅读每一行。如果该行包含=并且=前面的部分包含环境中的任何变量名(我用/i使其不区分大小写),则使用匹配值生成一行。如果在执行for..%%u#keep仍然设置,则没有匹配项,因此如果没有=,请重现原始x=y或原始行。

可以通过删除()之前的rem来生成输出文件。

输出文件必须与输入文件不同,并且应在批处理完成时移动到输入文件上(未显示)

--- 评论后---

因此,如果您按照最后两段中提供的说明进行操作,您将获得

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
rem The following settings for the source directory and filename are names
rem that I use for testing and deliberately include names which include spaces to make sure
rem that the process works using such names. These will need to be changed to suit your situation.
SET "sourcedir=u:your files"
SET "filename1=%sourcedir%q74276740.txt"
SET "outfile=outfile.txt"
set "s1=10"
set "s2=11"
set "s3=12"

(
FOR /f "usebackqtokens=1*delims==" %%b IN ("%filename1%") DO (
SET "#keep=Y"
FOR /f "tokens=1*delims==" %%u IN ('set') DO (IF /i "%%b"=="%%u" SET "#keep="&ECHO %%b=%%v)
IF DEFINED #keep IF "%%c"=="" (ECHO %%b) ELSE (ECHO %%b=%%c)
)
)>"%outfile%"
move "%outfile%" "%filename1%"
GOTO :EOF

== 根据保留空行的新要求修订处理部分 ==

REM (
FOR /f "tokens=1,2*delims=:=" %%g IN ('findstr /n ^^^^ "%filename1%"') DO IF "%%h"=="" (ECHO.) ELSE (
SET "#keep=Y"
FOR /f "tokens=1*delims==" %%u IN ('set') DO (IF /i "%%h"=="%%u" SET "#keep="&ECHO %%h=%%v)
IF DEFINED #keep IF "%%i"=="" (ECHO %%h) ELSE (ECHO %%h=%%i)
)
REM )>"%outfile%"

同样,需要删除rem关键字才能输出到指定文件。

更改只是通过findstr命令馈送文件,该命令生成前缀为linenumber:的文件列表。delims中的额外:会导致行号解析为%%g。我更改了元变量字母,因为处理需要三个字母,而且我宁愿不使用也是修饰符的字母。

如果findstr只生成一个行号,那么它是一个空行,所以%%h将是空的,我们只是生成一个空行,否则,像以前一样处理。

最新更新