在我看来,这是 SO 用语中的“XY”问题,即提出的问题是对未说明问题的错误解决方案。
基本问题似乎是:从包含行<add key="FileName" value="20220623.txt"/> 的模板文件test.exe.conf 开始,生成一个用新值替换20220623 的新文件。
OP 的代码旨在删除<add key.. 行,并且该代码中没有任何内容可以进行替换。
因此,我将提出一个旨在治愈问题,而不是代码.
因为我对这个问题做了一些假设,所以它可能不是我们想要的。
第一个问题是用什么字符串代替22020623 - 我认为它可能会随着时间的推移而改变,所以我添加了几行来提供或输入该数据,而不是更改批处理文件。这意味着您可以执行此批次名称 20221008运行批处理并生成一个用20221008 替换22020623 的文件,或者执行此批次名称并且批处理将提示用字符串替换22020623。请注意,尽管在任何一种情况下输入的任何字符串都将被逐字替换。
第二个问题是我假设test.exe.conf 是一个模板文件,因此可以对其进行操作-因此,获取原始test.exe.conf 并对其进行修改,以便将每个<add key... 行替换为唯一的字符串。我选择了substitute line here——但它几乎可以是任何字符串——例如@#123。
@ECHO OFF
SETLOCAL
rem The following settings for the source directory, destination directory,
rem filename, and output 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 "destdir=u:\your results"
SET "filename1=%sourcedir%\q73308290.txt"
SET "outfile=%destdir%\outfile.txt"
:: Get `newvalue`
SET "newvalue=%1"
IF NOT DEFINED newvalue SET /p "newvalue=New value ? "
IF NOT DEFINED newvalue GOTO :eof
(
FOR /f "usebackqdelims=" %%b IN ("%filename1%") DO (
IF /i "%%b"=="substitute line here" (
ECHO ^<add key="FileName" value="%newvalue%.txt"/^>
) ELSE ECHO %%b
)
)>"%outfile%"
GOTO :EOF
在应用于真实数据之前,请始终根据测试目录进行验证。
请注意,如果文件名不包含空格等分隔符,则usebackq 和%filename1% 周围的引号都可以省略。
显示的文件名适合我的系统,并允许我隔离问题的唯一数据。
该文件被逐行分配给%%b。如果%%b 不是触发线substitute line here 那么它只是由echo %%b 复制,但如果它是一条触发线,然后生成所需的替代线。
来自echos 的所有输出都被收集到一个新文件outfile.txt 中,方法是用一对括号和>filename 包围导致echoes 的代码。
--- cmets 后的修订
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
rem The following settings for the source directory, destination directory,
rem filename, and output 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 "destdir=u:\your results"
SET "filename1=%sourcedir%\q73308290.txt"
SET "outfile=%destdir%\outfile.txt"
:: Get `newvalue`
SET "newvalue=%1"
IF NOT DEFINED newvalue SET /p "newvalue=New value ? "
IF NOT DEFINED newvalue GOTO :eof
FOR /f "tokens=5delims==/ " %%e IN ('FINDSTR /i /R /c:".*add key=\"FileName\" value=\"[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9].txt\"/." "%filename1%"') DO SET "oldfn=%%~e"&GOTO process
:process
(
FOR /f "usebackqdelims=" %%b IN ("%filename1%") DO (
ECHO "%%b"|FINDSTR /i /R /c:".*add key=\"FileName\" value=\"[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9].txt\"/." >nul
IF ERRORLEVEL 1 (
ECHO %%b
) ELSE (
SET "line=%%b"
echo !line:%oldfn%=%newvalue%.txt!
)
)
)>"%outfile%"
:done
FC /w "%outfile%" "%filename1%"
GOTO :eof
在应用于真实数据之前,请始终根据测试目录进行验证。
请注意,如果文件名不包含空格等分隔符,则可以省略usebackq 和%filename1% 周围的引号。
这一次,%%e 从有问题的行中获取????????.txt 字符串并将其分配给oldfn。
然后处理该文件,简单地重复不包含所需字符串的行,否则使用DELAYEDEXPANSION 替换旧文件名的新值
...尽管如果允许使用第 3 方实用程序,使用 SED 的解决方案可能会更干净。