Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.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 7 批处理以在目录中的其他.txt文件中查找字符串(包含在textlist.txt中),并将值从.txt复制到新的_Windows 7_Batch File_Copy_Find - Fatal编程技术网

Windows 7 批处理以在目录中的其他.txt文件中查找字符串(包含在textlist.txt中),并将值从.txt复制到新的

Windows 7 批处理以在目录中的其他.txt文件中查找字符串(包含在textlist.txt中),并将值从.txt复制到新的,windows-7,batch-file,copy,find,Windows 7,Batch File,Copy,Find,查找批次时遇到问题,无法从文本文件中查找和复制textlist.txt中列出的字符串。是否可以使batch witch在目录中的文本文件中找到所有值(来自textlist),并将所有这些值复制到新文件中。 我有以下目录: textlist.txt包含: 3010 3020 3030 和其他包含txt文件的目录: 3010.txt包含分隔的制表符,例如: 3010 a1 3011 b1 3012 c1 例如,3020.txt包含: 3020 a4 3021 b3 3022 g5

查找批次时遇到问题,无法从文本文件中查找和复制textlist.txt中列出的字符串。是否可以使batch witch在目录中的文本文件中找到所有值(来自textlist),并将所有这些值复制到新文件中。 我有以下目录:

textlist.txt包含:

  • 3010
  • 3020
  • 3030
和其他包含txt文件的目录:

3010.txt包含分隔的制表符,例如:

  • 3010 a1
  • 3011 b1
  • 3012 c1
例如,3020.txt包含:

  • 3020 a4
  • 3021 b3
  • 3022 g5
3030.txt包含例如:

  • 3030 h5 g7
  • 3031 f2
  • 3032 t4
以及其他3040.txt、3050.txt等

我需要像这样的结果txt文件

  • 3010 a1{此字符串源于3010.txt,但可能在其他txt文件中找到。}
  • 3020 a4{此字符串源于3010.txt,但可能在其他txt文件中找到。}
  • 3030 h5 g7{此字符串源于3010.txt,但可能在其他txt文件中找到。}

感谢您的帮助。

使用for command为文件中的每一行执行命令(使用/F开关)。使用“查找”搜索文件。下面是一个示例,演示了它们的用法

“查找”报告匹配项,但也添加了一行以“----”开头的内容,以显示在哪个文件中找到了匹配项。这就是为什么第一个文件会转储到临时文件。第二个for将以“-”开头的任何行视为注释,从而从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

以下内容将生成一个文件,其中包含所有输入行的所有文件的匹配项:

@ECHO OFF
>results.txt (
  FOR /F "delims=" %%i IN (textlist.txt) DO (
    FIND "%%i" files\*.txt | FINDSTR /v "^---- ^$"
  )
)
它的工作原理如下:

@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
    获取一个输入行,在指定的文件中搜索它并打印结果,这些结果通过管道传输到
    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 "^---- ^$"
  )
)
更新2(以下是附加注释)

由于文件中的值是以制表符分隔的,您可以将分隔符包含在搜索项后面的搜索字符串中,以防止将
aaa
与例如
aaa/bbb
匹配。所以不是

FIND "%%i"
你会的

FIND "%%i   "
其中,
%%i
后面的空格是制表符

我还想建议另一种版本的
FINDSTR
命令。当您只搜索一个术语时,您可以更改以下内容:

FINDSTR /v "^---- ^$"
简单地说:

FINDSTR "%%i"

这个主意还可以,但有点不对劲。它不起作用。我将看到消息“文件正被其他进程使用”和“系统找不到结果.txt”,我修改了脚本以忽略分隔符。上面的脚本在我的Windows 7计算机上使用上述三个文件及其内容。您是否将“set searchFolder=…”更改为指向搜索文件所在的位置?确保该文件夹与textlist.txt或批处理文件所在的文件夹不同,并确保去掉任何后续的退格。它也可以是一行:
>results.txt(对于/F“delims=”%(textlist.txt)中的%%i do(查找“%%i”C:\folder\*.txt|findstr/v”^-^$”)
@Andriy M是否可以执行此脚本的第二部分,该部分显示。*txt文件中未包含的值,是否可以在一批中执行,因为结果是我需要两个单独的文件。在txt文件中找不到像上面这样的一个results.txt和带有字符串wchch的第二个notinfle.txt?非常感谢。我不知道为什么,但是这个脚本中的任何人都不工作。我试着只使用一个.txt文件,其中有两条记录,文本列表上有两个位置。它开始了,但需要很长时间才能完成。@Artec:不知道会是什么。在发布之前,我在WindowsXPSP3上测试了这个。@Andrey M:好吧,这是我的错误。我使用W7,效果很好。我更改了C:\folder*.txt上的文件*.txt,这是正常的,但我必须检查这一点,因为在result.txt中我看到的记录比在textlist.txt中看到的要多。可能这些值在我的文本文件中重复了。当我检查它时,我会发布结果。谢谢你的帮助。@Andrey M:我已经检查过这个脚本了。在txt文件中,我有带点、下划线和斜线的字符串,如104_2.0003.11/1、08_5.0013.24、08_5.0013.240/1、08_5.0013.240/2。当我查找08_5.0013.24(在textlist.txt中)时,我在results.txt中得到了08_5.0013.24和08_5.0013.240/1和08_5.0013.240/2(所有包含08_5.0013.24的值)等。是否可以修改脚本以仅查找插入到textlis的值。txt@Artec:在同一行(在目标文件中)的这些值之后是否有任何内容?我的意思是,匹配的行是看起来像
08_5.0013.24
(只是搜索的值)还是看起来像
08_5.0013.24 qwerty
(即搜索的值,然后是空格,然后是其他东西)?