从 .ini 中删除部分的脚本

问题描述 投票:0回答:1

我想要一个可以从 .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
batch-file cmd command-line
1个回答
0
投票

请参阅使用布尔值 允许这种简化,不需要

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
用作布尔值 - 它要么有一个值(该值不相关),要么未定义。

© www.soinside.com 2019 - 2024. All rights reserved.