如何在批处理脚本中使用FOR循环来防止.txt文件迭代时防止空白行

问题描述

我有一个.txt文件,其中包含文本和一些空白行。通过使用for循环在.txt文件中进行某些操作时,发现原来包含的空白行已消失。

示例: 我有一个temp.txt文件,其输入如下:

#
 Require
 #

 #Rel task
 #
 
 HOST_ID=

 ACTIVATE_ID

 #
 #

使用FOR循环执行一些操作后,我在相同的.txt文件中得到结果,如下所示:

#
 Require
 #
 #Rel task
 #
 HOST_ID=56767\Ether
 ACTIVATE_ID
 #
 #

因此,我不想忽略那些空白行。 我尝试在for循环中使用usebacq关键字,但是没有用。 我尝试了每种可行的方法,但每次都失败。

这是我的代码

@echo off

setlocal enableextensions disabledelayedexpansion
set rem=56767\Ether
set "textFile=temp.txt"

for /f "delims=" %%i in ('type "%textFile%" ^& break ^> "%textFile%" ') do (
    set "line=%%i"
    setlocal enabledelayedexpansion
    
    if !line!==HOSTID= (
        set "foo=!line:HOSTID=HOSTID=%rem%!"
        set "line=!foo:~0,-1!"
    )
    >>"%textFile%" echo(!line!
    endlocal
)
:EXIT
pause

在上面的代码中,我正在在同一.txt文件中提供的字符串之前附加一些额外的字符串。

解决方法

我不确定您的文件是否像当前一样在HOST_ID=之前有空格,但是在此示例中添加了两个有/无空格的地方:

@echo off

setlocal enableextensions disabledelayedexpansion
set "rem=56767\Ether"
set "textFile=temp.txt"
for /f "tokens=1,* delims=[]" %%i in ('type "%textFile%" ^| find /v /n "" ^& break^>"%textFile%"') do (
    set "line=%%j"
    setlocal enabledelayedexpansion
    if "!line!" == "HOST_ID=" set "line=!line!%rem%"
    if "!line!" == " HOST_ID=" set "line=!line!%rem%" 
    echo(!line!
    endlocal
)
:EXIT
pause

定界符为[],因为我们通过使用[n]在每个条目之前添加了您看不到的行号find /V /N ""。这样我们就保留了空行。

,

这是另一种方法,其想法是您不需要延迟扩展,并且(出于安全考虑),您不想尝试读取和写入同一文件。 / p>

首先要确定文件中是否存在所需的字符串,如果脚本没有关闭,则将其设置为行号。然后,该文件将被解析,输出未修改的每一行的内容(匹配保存的变量的行除外),并在其中附加%rem%

脚本结束时,原始文件应以.bak扩展名存在。

@Echo Off
SetLocal EnableExtensions

Set "rem=56767\Ether"
Set "textFile=temp.txt"

Set "lineNum="
For /F Delims^=: %%G In ('^""%__AppDir__%findstr.exe" /INR "\<HOST_ID=\>" "%textFile%" 2^>NUL^"')Do Set "lineNum=%%G"
If Not Defined lineNum GoTo :EOF
For %%G In ("%textFile%")Do Set "_=%%~nG.bak" & Copy /Y "%%G" "%%~nG.bak">NUL
(For /F "Tokens=1*Delims=:" %%G In ('^""%__AppDir__%findstr.exe" /N "^" "%_%"^"')Do If %%G NEq %lineNum% (Echo=%%H)Else Echo %%H%rem%)>"%textFile%"
Pause