在查找批处理以查找和复制textlist.txt中列出的文本文件中的字符串时遇到问题。是否有可能使批处理应该在目录中的文本文件中找到所有值(来自textlist)并将所有这些值复制到新文件中。 我有以下目录:
textlist.txt包含:
和其他带有txt文件的目录:
3010.txt包含分隔符,例如:
3020.txt包含例如:
3030.txt包含例如:
和其他3040.txt,3050.txt等。
我需要像这样的结果txt文件。
感谢您的帮助。
答案 0 :(得分:1)
以下内容将生成一个文件,其中包含所有输入行的所有文件的匹配项:
@ECHO OFF
>results.txt (
FOR /F "delims=" %%i IN (textlist.txt) DO (
FIND "%%i" files\*.txt | FINDSTR /v "^---- ^$"
)
)
它的工作原理如下:
FIND
接受一个输入行,在指定的文件中搜索它并打印结果,这些结果通过管道传输到FINDSTR
。
FINDSTR
删除FIND
产生的'噪音'(空行和------ filename.txt
之类的行)并打印其余内容。
解析后的结果将打印在标准输出上,并在整个循环中重定向到results.txt
。
如果根据您的评论,您还需要创建另一个包含没有匹配项的行的文件,您可以像这样修改上述脚本:
@ECHO OFF
>results.txt 2>notinfile.txt (
FOR /F "delims=" %%i IN (textlist.txt) DO (
(FIND "%%i" files\*.txt || (ECHO %%i) 1>&2) | FINDSTR /v "^---- ^$"
)
)
除非FIND
没有输入行匹配,否则逻辑基本相同。在这种情况下,搜索词会打印在标准错误(ECHO … 1>&2
)上。 FIND
的标准输出仍会传递给FINDSTR
,因为在这种情况下它只包含 噪音,FINDSTR
不会产生任何效果。
因此,循环在标准输出和标准错误上产生结果,每次都取决于FIND
的结果。与以前的版本一样,标准输出被重定向到results.txt
,标准错误被重定向到notinfile.txt
。
<强>更新强>
第二个脚本有一个很小的缺陷,在您的情况下可能会或可能不会很严重,具体取决于您将如何使用notinfile.txt
文件。该缺陷包括在notinfile.txt
的每个值的末尾添加一个额外的空格。
无论是某种bug还是某种人工制品,我都不知道,但我发现如果我将FIND
的结果存储到一个临时文件中,然后将它们加载到{{ 1}},不会产生额外的空间。我找不到任何其他方法来修复额外的空间问题,所以这是修改后的版本:
FINDSTR
更新2 (以下是其他评论)
由于文件中的值是制表符分隔的,因此您可以在搜索字符之后的搜索字符串中包含分隔符,以防止@ECHO OFF
>results.txt 2>notinfile.txt (
FOR /F "delims=" %%i IN (textlist.txt) DO (
FIND "%%i" files\*.txt >tmpResults || (ECHO %%i) 1>&2
FINDSTR /v "^---- ^$" <tmpResults
)
)
DEL tmpResults 2>NUL
与例如aaa
匹配。 aaa/bbb
。而不是
FIND "%%i"
你会有
FIND "%%i "
%%i
之后的宽空格是制表符。
我还想建议FINDSTR
命令的替代版本。当您只搜索一个术语时,您可以更改此信息:
FINDSTR /v "^---- ^$"
只是这个:
FINDSTR "%%i"
答案 1 :(得分:0)
使用FOR命令为文件中的每一行执行命令(使用/ F开关)。使用FIND搜索文件。这是一个演示其用途的示例。
FIND报告匹配,但也添加一行以&#34; ----&#34;显示找到匹配项的文件。这就是第一个FOR转储到临时文件的原因。第二个用于评论任何以&#34; - &#34;开头的行。从而过滤掉FIND中的信息。如果您多次运行批处理,它将删除任何以前的results.txt文件。
重要的是textlist.txt文件与搜索文件夹不在同一文件夹中,否则其内容将包含在结果中。
@echo off
setlocal
set searchFolder=C:\theFolder
del tempResults.txt >nul 2>nul
del results.txt >nul 2>nul
for /F "delims=" %%i in (textlist.txt) do find "%%i" %searchFolder%\*.txt >> tempResults.txt
for /F "delims=" "eol=-" %%i in (tempResults.txt) do echo %%i >>results.txt
del tempResults.txt >nul 2>nul
endlocal