[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 批处理文件能否搜索包含特定文字的文本文档?

一个名为1.txt的文本文档,里面有如下内容::
D:\123
D:\456
D:\789
一个名为2.txt的文本文档,里面有如下内容:

批处理之家
bathome


要求1
现在我想用一个批处理文件,在1.txt中记录的路径中搜索所有TXT文件,并将包含2.txt中的任意一个词语的所有文档输出到3.txt

要求2
用一个批处理文件,在1.txt中记录的路径中搜索所有TXT文件,并将包含2.txt中的所有词语的所有文档输出到4.txt

谢谢

[ 本帖最后由 smallbear 于 2010-5-19 22:26 编辑 ]

第一步:
  1. @echo off  
  2. for /f "delims=" %%a in (1.txt) do (
  3. for /f "delims=" %%b in ('dir /s /b /a-d "%%a\*.txt"') do (
  4.    setlocal enabledelayedexpansion
  5.    echo %%~nxb>tmp_.txt
  6.    findstr /i /g:2.txt tmp_.txt >>3.txt
  7.    endlocal
  8. )
  9. )
  10. pause
  11. del tmp_.txt
复制代码

[ 本帖最后由 sgaizxt001 于 2010-5-19 23:35 编辑 ]
努力学习,努力挣分

TOP

第2步,想了一下,思路是对每个文本的内容进行逐字判断,如果包含这些字,就输出问本名,最后COPY /B,如果不包含就不要,但是效率将非常非常的底,没必要写了。
不知道楼主提这样的要求是要做什么用
另外想请教一下关于findstr /d:的用法

[ 本帖最后由 sgaizxt001 于 2010-5-19 23:31 编辑 ]
努力学习,努力挣分

TOP

先谢谢楼上的兄弟,可是我试了下,输出的3.txt里面是空的啊?

TOP

我的输出结果:
bathomebbb.txt
批处理之家aaa.txt
bathomebcd.txt
批处理之家abc.txt
bathome123.txt
批处理之家asd.txt

我把/b参数去掉了,你在复制代码看看。

[ 本帖最后由 sgaizxt001 于 2010-5-19 23:38 编辑 ]
努力学习,努力挣分

TOP

  第1步:
  1. @echo off
  2. (for /f "delims=" %%i in (1.txt) do (
  3.     findstr /i /g:2.txt "%%i\*.txt"
  4. ))>3.txt
复制代码
  以上代码未经测试,请自行测试。

  在写出第2步代码之前,我想了解一下2.txt中有多少行字符串?
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

namejm,能否帮我讲解一下findstr /d:dir的用法?
谢谢
努力学习,努力挣分

TOP

不是很多,三四行吧.谢谢.

TOP

原帖由 sgaizxt001 于 2010-5-19 23:36 发表
我的输出结果:
bathomebbb.txt
批处理之家aaa.txt
bathomebcd.txt
批处理之家abc.txt
bathome123.txt
批处理之家asd.txt

我把/b参数去掉了,你在复制代码看看。



怪事,我这里还是不行.

TOP

原帖由 namejm 于 2010-5-19 23:37 发表
  第1步:@echo off
(for /f "delims=" %%i in (1.txt) do (
    findstr /i /g:2.txt "%%i\*.txt"
))>3.txt  以上代码未经测试,请自行测试。

  在写出第2步代码之前,我想了解一下2.txt中有多少行字符 ...



该代码把所有包含关键字的行全部输出了,能不能只输出包含关键字文件的文件名?

谢谢.

[ 本帖最后由 smallbear 于 2010-5-19 23:52 编辑 ]

TOP

原来是只输出文件名而不是输出文件内容啊,那改一下吧:
  1. @echo off
  2. (for /f "delims=" %%i in (1.txt) do (
  3.     findstr /i /m /g:2.txt "%%i\*.txt"
  4. ))>3.txt
复制代码
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

findstr 能做大部份工作了, 再for 取到输出中有用的部分就可以

TOP

谢谢楼上各位的帮助,11楼的代码非常好,完全能够达到我的要求1.不知道能不能帮我把要求2也写一下呢?   
非常感谢

TOP

原帖由 sgaizxt001 于 2010-5-19 23:39 发表
namejm,能否帮我讲解一下findstr /d:dir的用法?
谢谢

查看了一下 findstr /? 和 ntcmds.chm 中关于 findstr 的解释,发现它们对分隔符号的定义是完全不同的,一个是以逗号作分隔符,一个说是以分号做分隔符,反复测试,竟然找不到这个参数的正确用法,真是灵异。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

回复 14楼 的帖子

我的XP SP2测试一下就出来了啊:
C:\Documents and Settings\Administrator\桌面>findstr /m /d:.;\ . *.txt *.ini
  .:
an.txt
u8.txt
西游记中红孩儿的老爸是谁.txt
  \:
boot.ini
C:\Documents and Settings\Administrator\桌面>findstr /m /d:.,\ . *.txt *.ini
  .,\:
FINDSTR: 无法打开 .,\
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

返回列表