标题: [文本处理] 批处理怎样查找同一目录下不同文件名的文件【已解决】 [打印本页]
作者: fish509008 时间: 2014-12-2 15:04 标题: 批处理怎样查找同一目录下不同文件名的文件【已解决】
本帖最后由 fish509008 于 2014-12-3 16:25 编辑
有时间的大神帮看看怎么实现下面的文件查找啊。
同一目录下有四类文件名,分别为AAAA_*.TXT,BBBB_*.TXT,CCCC_*A.TXT,DDDD_*B.TXT 文件名我是泛指,4个类型的文件名间没有关联。
AAAA_1.TXT文件内容如下,相类似的为AAAA_2.TXT、AAAA_3.TXT...AAAA_100.TXT 需要统计不包含a的文件名
...
a
...
AAAA_1.TXT文件内容如下,相类似的为AAAA_2.TXT、AAAA_3.TXT...AAAA_100.TXT 需要统计含a的行,如果行数不等于X则打印文件名
...
a
b
a
c
...
CCCC_1A.TXT文件内容如下,相类似的为CCCC_2A.TXT、CCCC_3A.TXT...CCCC_100A.TXT 需要统计含a的行,如果行数不等于X则打印文件名
...
a
b
a
c
...
DDDD_1B.TXT文件内容如下,相类似的为DDDD_2B.TXT、DDDD_3B.TXT...DDDD_100B.TXT 需要统计含a的行,如果行数不等于X则打印文件名
...
a
b
a
c
...
作者: fish509008 时间: 2014-12-2 15:07
目前我只进行到第一个类型的统计
代码如下:
@echo off &color 0a &setlocal enabledelayedexpansion
pushd "%cd%"
title FILE-CHECK
if not exist "%CHECK_RESULT.txt" (echo.日期 时间 文件名)>"CHECK_RESULT.txt"
find /v "in-service" AAAA_1.txt (echo.%date:~0,10% %time:~0,8% "AAAA_1.txt")>>"%CHECK_RESULT.txt"
一个文件查找都失败,所以想请教下高手们
作者: DAIC 时间: 2014-12-2 16:57
最后一行的语法是错误的,改成这样试试:- find /v "in-service" AAAA_1.txt && echo %date:~0,10% %time:~0,8% "AAAA_1.txt">>"CHECK_RESULT.txt"
复制代码
作者: fish509008 时间: 2014-12-2 18:31
回复 3# DAIC - find /v "a" AAAA_1.txt && echo %date:~0,10% %time:~0,8% AAAA_1.txt>>CHECK_RESULT.txt
复制代码
我试了下 为啥明明里面有要搜索的字符串“a” 还是会把文件名给打印出来啊?
作者: fish509008 时间: 2014-12-2 19:46
- @echo off &color 0a &setlocal enabledelayedexpansion
- pushd "%cd%"
- REM 设置变量
- title PBX-CHECK
- REM 检查link资源使用情况统计文件
- if not exist "%CHECK_RESULT.txt" (echo.日期 时间 文件名)>CHECK_RESULT.txt
- for /l %%i in (1,1,10) do (find /v "a" AAAA_%%i.txt && echo %date:~0,10% %time:~0,8% AAAA_%%i.txt>>CHECK_RESULT.txt)
- pause
复制代码
这是我新写的第一个类型输出统计代码。
输出结果与预想不符。AAAA_%%i.txt中不管有没有“a”,最后都把AAAA_%%i.txt输出到CHECK_RESULT.txt中了
求大神指教下!!!
作者: terse 时间: 2014-12-2 22:36
试下 finedstr /m 参数
作者: amwfjhh 时间: 2014-12-2 23:33
用重定向符"<"来给find传参,find认为来自于流的内容,就可以不打印出文件名。
作者: apang 时间: 2014-12-3 00:21
感觉LZ好像要这样:- @echo off
- set "x=2"
- for /f "tokens=*delims=- " %%a in ('find /c "a" *.txt') do (
- for /f "tokens=1,2 delims=:" %%b in ("%%a") do (
- if "%%c" NEQ " %x%" echo,%%b
- )
- )
- pause
复制代码
作者: fish509008 时间: 2014-12-3 09:16
回复 7# amwfjhh
这个参数具体加在代码的什么位置啊?
作者: fish509008 时间: 2014-12-3 09:24
回复 8# apang
有点看不明白您的代码,我一共要统计出四类有问题的文件名,文件名中的*是数字,目前最多到40,以后可能还会增加的
第一类是AAAA_*.TXT,如果哪个文件里面不包含“1”,则输出此文件名
第二类是BBBB_*.TXT,如果哪个文件里含“2”行数小于10,则输出文件名
第三类是CCCC_*a.TXT,如果哪个文件里含“3”行数小于10,则输出文件名
第四类是DDDD_*b.TXT,如果哪个文件里含“3”行数小于10,则输出文件名
作者: amwfjhh 时间: 2014-12-3 09:43
回复 9# fish509008
以你的代码来说,改下这句:复制代码
为复制代码
FOR条件语句里面注意转义<号。
作者: fish509008 时间: 2014-12-3 10:07
回复 11# amwfjhh - @echo off &color 0a &setlocal enabledelayedexpansion
- pushd "%cd%"
- REM 设置变量
- title PBX-CHECK
- REM 检查link资源使用情况统计文件
- if not exist "%CHECK_RESULT.txt" (echo.日期 时间 文件名)>CHECK_RESULT.txt
- for /l %%i in (1,1,10) do (find /v "a" ^<^AAAA_%%i.txt && echo %date:~0,10% %time:~0,8% AAAA_%%i.txt>>CHECK_RESULT.txt)
- pause
复制代码
加上<后 有“a”字符的没有打印输入了,但是没有“a”字符的文件名也没有输出啊....
作者: DAIC 时间: 2014-12-3 10:11
- @echo off
- REM 第一类
- echo 日期 时间 文件名>"CHECK_RESULT.txt"
- (for /l %%i in (1,1,10) do (
- if exist AAAA_%%i.txt (
- for /f %%j in ('type AAAA_%%i.txt ^| find /c "a"') do (
- if %%j equ 0 (
- echo %date:~0,10% %time:~0,8% AAAA_%%i.txt
- )
- )
- )
- ))>>CHECK_RESULT.txt
复制代码
作者: amwfjhh 时间: 2014-12-3 10:19
回复 12# fish509008
你先把''间的语句列出来单独执行一下看看。先确定这条语句能正确出结果,再加到FOR循环里面去。"<"的FOR条件转义只在"<"左边加转义符就行了。
楼上DAIC的代码与<类似,都是find从流中读取内容,类似的写法还有more AAA_%%i.txt | find /c "a"
作者: fish509008 时间: 2014-12-3 10:27
回复 14# amwfjhh
转义符^<我开始也试过了的,没有输出正确的结果。
作者: fish509008 时间: 2014-12-3 10:30
回复 13# DAIC
这个输出结果是正确的。感谢DAIC!
作者: DAIC 时间: 2014-12-3 10:58
回复 16# fish509008
其它类型知道怎么写了吗
作者: fish509008 时间: 2014-12-3 11:05
回复 17# DAIC
嗯 我自己先琢磨下...没思路了再请教你。
作者: amwfjhh 时间: 2014-12-3 12:00
回复 15# fish509008
在do语句块里面直接用就是了,不用转义。我说如果是在for ... in ('') do() 的in条件里面,被作为执行语句分析结果的话,就需要转义一下了,当然不是绝对,还有些情况也可以直接用,比如被 ""包起来,然后usebackq……
作者: fish509008 时间: 2014-12-3 12:05
回复 17# DAIC - @echo off
- REM 第一类
- echo 日期 时间 文件名>"CHECK_RESULT.txt"
- (for /l %%i in (1,1,10) do (
- if exist AAAA_%%i.txt (
- for /f %%j in ('type AAAA_%%i.txt ^| find /c "a"') do (
- if %%j equ 0 (
- echo %date:~0,10% %time:~0,8% AAAA_%%i.txt
- )
- )
- )
- if exist CCCC_%%ia.txt (
- for /f %%j in ('type CCCC_%%ia.txt ^| find /c "a"') do (
- if %%j neq 8 (
- echo %date:~0,10% %time:~0,8% CCCC_%%ia.txt
- )
- )
- )
- if exist DDDD_%%ib.txt (
- for /f %%j in ('type DDDD_%%ib.txt ^| find /c "a"') do (
- if %%j neq 8 (
- echo %date:~0,10% %time:~0,8% DDDD_%%ib.txt
- )
- )
- )
- ))>>CHECK_RESULT.txt
复制代码
ACD这三类统计现在都没问题了。感谢DIAC提供的帮助。
但是我在统计B文件名类型的文件时候,发现BBBB_*.TXT中的“a”行数并不确定,附件里有BBBB_*.TXT的源文件,第三列Service State的状态不是“in-service/”就要把文件名给统计出来的
麻烦DAIC兄再帮我看看啊
作者: fish509008 时间: 2014-12-3 12:23
回复 19# amwfjhh
嗯 ,我大概明白了
谢谢啊
你帮我看看20楼的描述,附件里有具体文件,我开始不知道怎么计算那个不确定的行数了,现在发现思路有问题,我应该把第三部分“/”前的值是不是“in-service”来作为搜索条件,但是我不知道该怎么正确的获取第三部分,因为有的行没有那么多内容
作者: amwfjhh 时间: 2014-12-3 13:26
本帖最后由 amwfjhh 于 2014-12-3 13:27 编辑
回复 21# fish509008
严格按照你说的来的话就是:- (for /f "tokens=4 delims=/ " %%k in ('findstr /r "^[0-9]*/[0-9]*" BBBB_%%i.txt') do echo %%k)|findstr /iv "in-service" && echo BBBB_%%i.txt
复制代码
当然也可以在FOR中进行判断,有不符合的立即GOTO跳出,但即使这样,FOR所预留出来的执行周期也会遍历完,效率有点低。
稍微宽松点的判断可以直接从有效行中查找in-service- findstr /r "^[0-9]*/[0-9]*" BBBB_%%i.txt|findstr /iv "in-service" && echo BBBB_%%i.txt
复制代码
再不负责点可以直接通篇查找不含in-service即可- findstr /iv "in-service" BBBB_%%i.txt && echo BBBB_%%i.txt
复制代码
作者: fish509008 时间: 2014-12-3 14:08
本帖最后由 fish509008 于 2014-12-3 14:12 编辑
回复 22# amwfjhh
通篇查找不包含"in-service"是不行的 因为有些行是类似表名的内容,里面肯定没有"in-service"'
我的思路是先skip跳过不用判断的行,然后tokens出第三列,然后在所有第三列里查找不包含"in-service"'的行,但是skip的值有点复杂啊,1,2,3,18,19,20,34,35,36... 也就是说3行表头,然后是14行需要查找的行,然后又是3行表头,不大于14行包含字符串的行...
直接tokens第三列,然后按照DAIC的方法统计是不是也能行啊,但是这中间嵌套了好几个for,我不知道该怎么写
作者: fish509008 时间: 2014-12-3 14:29
- @echo off
- echo 日期 时间 文件名>"CHECK_RESULT.txt"
- (for /l %%i in (1,1,200) do (
- if exist BBBB_%%i.txt (
- for /f %%j in ('for /f "tokens=3 delims= " %%k in ('type BBBB_%%i.txt') do echo %%k ^| find /c /v "in-service"') do (
- if %%j gtr 0 (
- echo %date:~0,10% %time:~0,8% BBBB_%%i.txt
- )
- )
- )
- ))>>CHECK_RESULT.txt
复制代码
这是我针对的类型的统计,目前还是没有达到预想的效果...
作者: DAIC 时间: 2014-12-3 15:38
- @echo off
- echo 日期 时间 文件名>"CHECK_RESULT.txt"
- (for /l %%i in (1,1,10) do (
- REM 第一类
- if exist AAAA_%%i.txt (
- for /f %%j in ('type AAAA_%%i.txt ^| find /c "a"') do (
- if %%j equ 0 (
- echo %date:~0,10% %time:~0,8% AAAA_%%i.txt
- )
- )
- )
- REM 第二类
- if exist BBBB_%%i.txt (
- for /f %%j in ('type BBBB_%%i.txt ^| find "/" ^| find /v /c "in-service"') do (
- if %%j neq 0 (
- echo %date:~0,10% %time:~0,8% BBBB_%%i.txt
- )
- )
- )
- REM 第三类
- if exist CCCC_%%ia.txt (
- for /f %%j in ('type CCCC_%%ia.txt ^| find /c "a"') do (
- if %%j neq 8 (
- echo %date:~0,10% %time:~0,8% CCCC_%%ia.txt
- )
- )
- )
- REM 第四类
- if exist DDDD_%%ib.txt (
- for /f %%j in ('type DDDD_%%ib.txt ^| find /c "a"') do (
- if %%j neq 8 (
- echo %date:~0,10% %time:~0,8% DDDD_%%ib.txt
- )
- )
- )
- ))>>CHECK_RESULT.txt
复制代码
作者: fish509008 时间: 2014-12-3 16:18
回复 25# DAIC
太感谢了!我怎么就没想着查找“/”呢
高手的大脑就是不一样啊
四个类型的都可以统计,感谢DAIC的热心帮助!!!
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |