Board logo

标题: [文件操作] 【已解决】批处理如何检查当前文件夹内是否存在文件名包含指定关键词的文件 [打印本页]

作者: clk_gameboy    时间: 2018-6-15 17:35     标题: 【已解决】批处理如何检查当前文件夹内是否存在文件名包含指定关键词的文件

本帖最后由 clk_gameboy 于 2018-7-2 08:53 编辑

批处理能否实现【检查当前文件夹内,是否包含特定的若干个关键词】?
例如:

某人每天需要接收30个人的特定文件;
当收到十几个,或二十几个时,剩余几个会比较难判断;
虽然可以借用0字节文件,按名称排序来筛选,但显得有点不直观;

所以请教大神,能否在下列条件下,实现【查找关键词,得出未发文件的人】?

已知:

1.这些文件的命名已被统一格式,但不一定是同一个拓展名,如:
张三20180615.doc
李四20180615.docx
王五20180615.xls
赵六20180615.zip
……
路易三十20180615.pdf

2.格式固定为【姓名+无符号的年月日】,姓名永远不变,日期为变量;

3.(尽可能)希望能得到一个适用性广的代码;
比如,当下次格式变成【无符号的年月日 + 姓名】时,依然可用;

4.(尽可能)希望能得到类似如下排版的反馈信息:

(假设只有李四没报)

A版式-排列式:
张三,Y(或者可以自定义为【已报/√】)
李四,N(或者可以自定义为【未报/×】)
王五,Y
赵六,Y
……
路易三十,Y

B版式-结果式:
(上报情况:29/30),李四
or
(未上报数量:1),李四



要求有点多,谢谢各位大佬!
作者: hlzj88    时间: 2018-6-15 20:24

  1. @echo off
  2. for /f %%i in (名单.txt) do if not exist *%%i* echo %%i>>未报.ini
  3. type 未报.ini
  4. echo.
  5. echo 以上是未报名单,按任意键结束
  6. del /q *.ini
  7. pause>nul
复制代码
把你要检查的所有姓名写入到名单文本+名单+本批处理保存的名称,一行一个,运行即可。
作者: yhcfsr    时间: 2018-6-16 01:59

使用说明:
下载论坛第三方命令行 DateX和EchoX ,和脚本放在一起(或者放入system32目录,或者更将第三方命令行所在目录加入环境变量PATH)
  1. @echo off
  2. for /f %%a in ('datex -f "yyyymmdd"') do set "_date=%%a"
  3. for /f "delims=" %%a in ('type name_list.txt') do (
  4. set "n="
  5. for /r "d:\test\测试" %%b in (*%%a*%_date%* *%_date%*%%a*) do set n=1
  6. if defined n (
  7. echox  -w 14 -c 0e -n "%%a"
  8. echox  -w 12 -c 0e "【已报/√】"
  9. set/a yes+=1
  10. ) else (
  11. echox  -w 14 -c 04 -n "%%a"
  12. echox  -w 12 -c 04 "【未报/×】"
  13. set/a not+=1
  14. )
  15. )
  16. set/a sum=%yes%+%not%
  17. echo.&echo 结果统计:
  18. echo 已上报 %yes%/%sum%
  19. echo 未上报 %not%/%sum%
  20. pause
复制代码

作者: clk_gameboy    时间: 2018-6-21 10:22

把你要检查的所有姓名写入到名单文本+名单+本批处理保存的名称,一行一个,运行即可。
hlzj88 发表于 2018-6-15 20:24


按大佬说的,成功了,然后我改造了一下:
先利用批处理创建那个名单TXT,查漏并显示结果后,再删除那个名单TXT,实现单文件,非常感谢!

大佬万岁!
  1. @echo off
  2. echo 张三>>名单.txt
  3. echo 李四>>名单.txt
  4. echo 王五>>名单.txt
  5. echo 赵六>>名单.txt
  6. for /f %%i in (名单.txt) do if not exist *%%i* echo %%i>>未报.ini
  7. type 未报.ini
  8. echo.
  9. echo 以上是未报名单,按任意键结束
  10. del /q *.ini
  11. del /q 名单.txt
  12. pause>nul
复制代码

作者: clk_gameboy    时间: 2018-6-21 10:47

使用说明:
下载论坛第三方命令行 DateX和EchoX ,和脚本放在一起(或者放入system32目录,或者更将第三方命令 ...
yhcfsr 发表于 2018-6-16 01:59


大佬,您这个好漂亮啊!

我试了一下,发现失败了,有劳您看看,是我哪里做错了吗?
作者: yhcfsr    时间: 2018-6-21 12:27

本帖最后由 yhcfsr 于 2018-6-21 12:32 编辑

回复 5# clk_gameboy
  1.   for /r "d:\test\测试" %%b in (*%%a*%_date%* *%_date%*%%a*) do set n=1
复制代码
这句里面的"d:\test\测试"是指文件所在目录。很显然,你的目录并不是这样的。
我注意到你的文件和BAT放在一起,可以直接删除,即改成 for /r %%b in ........
又或者自定义为文件所在目录

再补充一点,测试代码中,BAT与名单文件name_list.txt是放一起的.如果不是放一起,name_list.txt要写全路径如:"d:\abc\123\name_list.txt",双引号也不能省.
作者: clk_gameboy    时间: 2018-6-29 16:39

回复 6# yhcfsr

大佬,我按你说的,测试了两个:

1.我去D盘根目录建立了test/测试的文件夹,丢进去,还是不行……

2.按您说的删除,改为“for /r %%b in...”,也还是一样不行……

name_list.txt我一直跟bat放在一起的……




作者: yhcfsr    时间: 2018-6-29 17:07

本帖最后由 yhcfsr 于 2018-6-29 18:39 编辑

回复 7# clk_gameboy

问题所在,是第一步获取的日期,DATEX获取的是当前日期,你的文件全都是过去的日期,怎么可能匹配到文件????????
下面脚本改了下,有详细说明.不过我没有测试,如果有问题,请反馈.
  1. @echo off
  2. ::脚本可以放在任何地方执行,不一定要和名单或要检索的文件放在一起
  3. ::=======用户定义区=========================
  4. ::指定要检索的文件日期,格式有多种,以下仅供参考.
  5. ::如果不指定日期,可以删除下面语句,则获取当前日期
  6. set "spDate=2018-06-16"
  7. ::指定文件要检索的文件目录
  8. ::如果不指定,可删除下面语句;此时,BAT脚本要与检索文件放在同一目录
  9. set "srcDir=d:\test\测试"
  10. ::指定名单路径
  11. ::如果不指定,可删除下面语句;则名单文件名必须为name_list.txt,且必须与BAT放在一起
  12. set "namList=d:\test\name_list.txt"
  13. ::==========================================
  14. if not defined spDate set "spDate=%date%"
  15. if not defined srcDir set "srcDir=%cd%"
  16. if not defined namLst set "namList=name_list.txt"
  17. for /f %%a in ('datex -d %spDate% -f "yyyymmdd"') do set "_date=%%a"
  18. for /f "delims=" %%a in ('type "%name_list%"') do (
  19. set "n="
  20. for /r "%srcDir%" %%b in (*%%a*%_date%* *%_date%*%%a*) do set n=1
  21. if defined n (
  22. echox  -w 14 -c 0e -n "%%a"
  23. echox  -w 12 -c 0e "【已报/√】"
  24. set/a yes+=1
  25. ) else (
  26. echox  -w 14 -c 04 -n "%%a"
  27. echox  -w 12 -c 04 "【未报/×】"
  28. set/a not+=1
  29. )
  30. )
  31. set/a sum=%yes%+%not%
  32. echo.&echo 结果统计:
  33. echo 已上报 %yes%/%sum%
  34. echo 未上报 %not%/%sum%
  35. pause
复制代码

作者: clk_gameboy    时间: 2018-7-2 08:50

回复 8# yhcfsr


谢谢大佬,搞定了:

我之前不知道还跟时间有关系,改成当天就可以了,因为我只是知道批处理很牛逼,但是基本语句不太懂,给大佬添麻烦了;

我也忘记说了,就是有可能会有人,因为各种各样的原因,第二天才报。




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2