批处理,如果行没有文本,则回显上一行

时间:2014-08-29 12:42:29

标签: batch-file cmd batch-processing

我试图逐行读取文本文件,如果一行是null,我认为它不应该是echo -1 line。

文本文件包含如下文本:

Town
Hereford
C:\Installer.exe
192840573



Town
Greenock
C:\Installer.exe
192840573



Town
York



Town
Ipswich
C:\Installer.exe
192840573

我想做的是回复约克没有Installer.exe 这因城镇而异,多个城镇可能缺少安装人员。

所有人都非常感谢。

2 个答案:

答案 0 :(得分:1)

@ECHO Off
SET "Town="
SET "Townname="
SETLOCAL
FOR /f "delims=" %%a IN (q25568537.txt) DO (
 IF DEFINED town IF NOT DEFINED townname SET "townname=%%a"
 IF /i "%%a"=="Town" (
  IF DEFINED townname CALL ECHO %%townname%%
  SET "Town=Y"
  SET "Townname="
 )
 IF /i "%%a"=="C:\Installer.exe" SET "Townname="&SET "town="
)

IF DEFINED town IF DEFINED townname CALL ECHO %%townname%%

GOTO :EOF

我使用了一个名为q25568537.txt的文件,其中包含我的测试数据。

请注意,批处理环境变量不区分大小写。 if /i语法使字符串比较不区分大小写;这里可能没有必要,但在这种情况下也是无害的。

答案 1 :(得分:0)

Magoo的解决方案可行,但对于大文件来说可能会很慢。

这是另一种使用FINDSTR搜索换行符的解决方案。如果文件很小,那么它并不重要。但是如果文件有数千行,那么这个解决方案明显更快(我的机器上的因子为6)。这个解决方案仍然比Magoo的解决方案快一点,即使它被修改为使用延迟扩展。

我必须创建一个附加额外行的临时副本,以防最后一个城镇缺少安装程序。

我的代码假设该文件名为test.txt

@echo off
setlocal enableDelayedExpansion

set file=test.txt

::Define LF variable containing a linefeed (0x0A)
set ^"LF=^

^" Above empty line is critical - DO NOT REMOVE

::Define CR variable containing a carriage return (0x0D)
for /f %%a in ('copy /Z "%~dpf0" nul') do set "CR=%%a"

(type "%file%"&echo(&echo()>"%file%.new"
findstr /ir /c:"[a-z].*!CR!*!lf!!CR!*!LF!" "%file%.new"
del "%file%.new"