我想要一个可以从 .ini 文件中删除部分的 .bat 文件。所以当运行时我想删除一个特定的部分。该值当然是已知的,但其他内容是可变的,因此是未知的。它也不包含空行。
示例 test.ini 启动文件
[above]
valuetestabove
[toberemoved]
valuetoberemoved
[below]
valuetestbelow
想要 test.ini 结果
[above]
valuetestabove
[below]
valuetestbelow
我确实尝试用开始/结束标志读取和写入每一行,但它总是删除太多。
@echo off
setlocal enabledelayedexpansion
set "start=[toberemoved]"
set "end=["
set "flag=0"
(for /f "delims=" %%i in (test.ini) do (
if "%%i"=="!start!" (
set "flag=1"
)
echo %%i | findstr "^!end!" >nul && (
if "%%i" neq "!start!" (
set "flag=0"
)
)
if "!flag!"=="0" (
echo %%i
)
)) > newfile.txt
请参阅使用布尔值 允许这种简化,不需要
delayedexpansion
无论如何,由于
start
和 end
不会因循环而变化,因此 %start%
/%end%
可以在原始代码中使用(假设杂散插入符已被删除)
@ECHO OFF
SETLOCAL
rem The following settings for the directory and filename are names
rem that I use for testing and deliberately includes 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%\q78080807.txt"
SET "outfile=%destdir%\outfile.txt"
set "start=[toberemoved]"
set "end=["
set "flag=0"
(
FOR /f "usebackqdelims=" %%e IN ("%filename1%") DO (
IF "%%e"=="%start%" (SET "flag=") ELSE (
ECHO %%e|FIND "%end%" >NUL
IF NOT ERRORLEVEL 1 SET "flag=0"
)
IF DEFINED flag ECHO %%e
)
)>"%outfile%"
GOTO :EOF
在应用于真实数据之前,始终验证测试目录。
请注意,如果文件名不包含空格等分隔符,则
usebackq
和 %filename1%
周围的引号都可以省略。
请注意,
flag
用作布尔值 - 它要么有一个值(该值不相关),要么未定义。