Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 如何防止在批处理脚本中使用FOR循环迭代.txt文件时出现空行_Windows_For Loop_Batch File_Space - Fatal编程技术网

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

Windows 如何防止在批处理脚本中使用FOR循环迭代.txt文件时出现空行,windows,for-loop,batch-file,space,Windows,For Loop,Batch File,Space,我有一个带有文本和一些空白行的.txt文件。当使用for循环在.txt文件中执行某些操作时,发现原来包含的空白行消失了 例如: 我有一个带有以下输入的temp.txt文件: # Require # #Rel task # HOST_ID= ACTIVATE_ID # # 在使用FOR循环执行一些操作后,我将在相同的.txt文件中得到如下结果: # Require # #Rel task # HOST_ID=56767\Ether ACTIVATE_ID

我有一个带有文本和一些空白行的.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\u 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

分隔符是
[]
,因为我们通过使用
find/V/n”“
在每个条目之前添加行号,您不会将其视为
[n]
。这样我们就保留了空行。

我不确定您的文件是否像当前一样在
HOST\u 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

分隔符是
[]
,因为我们通过使用
find/V/n”“
在每个条目之前添加行号,您不会将其视为
[n]
。这样我们就保留了空行。

这里有一种替代方法,其思想是不需要延迟扩展,而且,(为了安全起见),您不需要尝试读取和写入同一个文件

它要做的是首先确定文件中是否存在所需的字符串,如果不存在,则脚本关闭,如果存在,则将变量设置为行号。然后对文件进行解析,输出除与保存的变量匹配的行之外的每一行的内容,该行将
%rem%
附加到文件中

当脚本结束时,您的原始文件应该与扩展名
.bak一起存在

@Echo关闭
setLocalEnableExtensions
设置“rem=56767\Ether”
设置“textFile=temp.txt”
设置“lineNum=”
对于/F Delims^=:%%G In(“^”“%”%\uuuuuu AppDir\uuuuu%findstr.exe“/INR“\”“%textFile%”“2^>num^”)请设置“lineNum=%%G”
如果未定义lineNum GoTo:EOF
对于“%textFile%”中的%%G,请设置“\=%%~nG.bak”&Copy/Y“%%G”“%%~nG.bak”>NUL
(对于/F“Tokens=1*Delims=:”%%G In(“^”“%”%\uuuuuuu AppDir\uuuuuuuu%findstr.exe”/N“^”“%”%\uuu%”^“)如果%%G NEq%lineNum%(Echo=%H)Else Echo%%H%rem%)>%textFile%,则执行此操作
暂停

这里有一种替代方法,其思想是您不需要延迟扩展,并且,(为了安全起见),您不需要尝试读取和写入同一个文件

它要做的是首先确定文件中是否存在所需的字符串,如果不存在,则脚本关闭,如果存在,则将变量设置为行号。然后对文件进行解析,输出除与保存的变量匹配的行之外的每一行的内容,该行将
%rem%
附加到文件中

当脚本结束时,您的原始文件应该与扩展名
.bak一起存在

@Echo关闭
setLocalEnableExtensions
设置“rem=56767\Ether”
设置“textFile=temp.txt”
设置“lineNum=”
对于/F Delims^=:%%G In(“^”“%”%\uuuuuu AppDir\uuuuu%findstr.exe“/INR“\”“%textFile%”“2^>num^”)请设置“lineNum=%%G”
如果未定义lineNum GoTo:EOF
对于“%textFile%”中的%%G,请设置“\=%%~nG.bak”&Copy/Y“%%G”“%%~nG.bak”>NUL
(对于/F“Tokens=1*Delims=:”%%G In(“^”“%”%\uuuuuuu AppDir\uuuuuuuu%findstr.exe”/N“^”“%”%\uuu%”^“)如果%%G NEq%lineNum%(Echo=%H)Else Echo%%H%rem%)>%textFile%,则执行此操作
暂停

@echo off
这不是bash。我试图删除不相关的内容tags@Jetchisel什么是鲍瓦贝壳?你是说
powershell
?与此相反,这是批处理文件
code。
for/f“tokens=1,*delims=[]“%%i in('type”%textFile%“^ find/v/n”“^&break^>%textFile%')do(
然后使用
%%j
而不是
%%i
@Gerhard。这对我很有效。非常感谢你的帮助。你能告诉我为什么使用
[]
在delims中。
for/F
通过设计忽略空行,因此
find/N
可用于预结束
[
加上行号加上
]
,这使/F的
行不再显示为空;然后通过
标记和
delims
选项删除前缀…
@echo off
这不是bash。我尝试删除不相关的tags@Jetchisel什么是Powah shell?你的意思是
powershell
?远远不是,这是
batch file
code.
对于/f“tokens=1,*delims=[]“%%i in('type”%textFile%“^ find/v/n”“^&break^>%textFile%')执行(
然后使用
%%j
而不是
%i
@Gerhard)。这对我很有效。非常感谢您的帮助。您能告诉我为什么使用
[]
在delims中。
for/F
通过设计忽略空行,因此
find/N
可用于预结束
[
加上行号加上
]
,这使得/F
行不再显示为空;然后通过
标记和
delims
选项删除前缀…请参阅答案底部关于
delims=[]
的注释请参阅答案底部关于
delims=[]
的注释