无忧启动论坛

标题: 如何根据LIST.TXT列表保留文件夹的文件写个批处理 [打印本页]

作者: 双响炮    时间: 2018-9-24 09:06
标题: 如何根据LIST.TXT列表保留文件夹的文件写个批处理
本帖最后由 双响炮 于 2018-9-24 09:15 编辑

想根据列表文件D:\LIST.TXT文件保留D:\XUNLEIVIP中相同文件名文件和不同后缀名的文件,删除后缀名相同但文件名不同的文件,写了个批处理执行不了,请大神们指点一下,网上看教程实在是弄不明白了。
  1. ::设置待处理目录
  2. set SrcDir=D:\xunleivip

  3. ::设置列表文件
  4. set LstFile=d:\list.txt

  5. for /f "delims=" %%a in ('dir /a-d/s/b "%SrcDir%\*"') do (
  6.     for /f "delims=" %%b in ('findstr /i  "^%%~b$" "%LstFile%"' ) do (
  7.          if not "%%~nxa"=="%%b (echo  del /f /q "%%~a")
  8.     )
  9.    rd "%%~dpa"
  10. )
  11. echo end ...
  12. pause
复制代码

作者: 窄口牛    时间: 2018-9-24 10:49
可能是我老了,理解力不够了。没看懂你的逻辑,大概猜的是:只留下单只后缀名的文件?


只留下一个文件?
作者: 双响炮    时间: 2018-9-24 14:06
可能我表达得不清楚,上图说明一下:

在文件夹xunleivip中要删除的是除了basecommunity.dll和downloadkernel.dll之外的所有后缀名为.dll的文件,其它文件和文件夹均保留
作者: 窄口牛    时间: 2018-9-24 14:40
本帖最后由 窄口牛 于 2018-9-24 14:43 编辑
  1. @echo off
  2. Setlocal enabledelayedexpansion
  3. for /f %%a in ('dir D:\XUNLEIVIP\*.dll /a-d /b^|findstr /v "basecommuny.dll downloaderkernel.dll"') do (
  4. echo del /q D:\XUNLEIVIP\%%a
  5. )
复制代码

作者: Eisan    时间: 2018-9-24 18:40
这个要mark 学习一下。
作者: 双响炮    时间: 2018-9-24 20:09
窄口牛 发表于 2018-9-24 14:40

老大这个方法应该可行,可是如果我的LIST.TXT的文件很多就不适用了,是吧
作者: nttwqz    时间: 2018-9-24 20:29
双响炮 发表于 2018-9-24 20:09
老大这个方法应该可行,可是如果我的LIST.TXT的文件很多就不适用了,是吧

尝试将findstr /v "basecommuny.dll downloaderkernel.dll" 改成

findstr /v /g:d:\list.txt
作者: 窄口牛    时间: 2018-9-24 21:14
可以的,findstr支持多字段。
作者: 双响炮    时间: 2018-9-24 21:14
nttwqz 发表于 2018-9-24 20:29
尝试将findstr /v "basecommuny.dll downloaderkernel.dll" 改成

findstr /v /g:d:\list.txt

不行,没任何反应
作者: 双响炮    时间: 2018-9-24 21:21
窄口牛 发表于 2018-9-24 21:14
可以的,findstr支持多字段。

我的意思是说不能把所有的保留文件都在批处理中列出来 呀,不然那个LIST.TXT文件就失去意义了
作者: nttwqz    时间: 2018-9-24 22:57
双响炮 发表于 2018-9-24 21:14
不行,没任何反应

呃~ 你都不会多试一下,牛大的思路没有问题

/V         只打印不包含匹配的行。
/G:file    从指定的文件获得搜索字符串。


例如:查找system32下的exe文件,并从结果中排除从a-g开头、从m-r开头的文件
dir c:\windows\system32\*.exe /b|findstr /v /i /g:"c:\dirlist.txt"

dirlist.txt内容

^[a-g]
^[m-r]
作者: 窄口牛    时间: 2018-9-25 08:22
老大的也没错,应该可以的。
作者: 双响炮    时间: 2018-9-25 14:31
nttwqz 发表于 2018-9-24 22:57
呃~ 你都不会多试一下,牛大的思路没有问题

/V         只打印不包含匹配的行。

我做了个简单的测试,在xunleivip目录下拷贝了4个.DLL文件,分别是:
  1. BaseCommunity.dll,DownloadClient.dll,DownloadKernel.dll,DownloadServer.dll
复制代码

然后新建了一个list.txt文件,内容为:
  1. d:\xunleivip\BaseCommunity.dll
复制代码

先试着运行
  1. dir D:\xunleivip\*.dll /a-d /b|findstr /v /i /g:"d:\list.txt"
复制代码
,发现运行结果是4个.DLL文件,并没有排除BaseCommunity.dll,
后来修改了list.txt文件的内容为:
  1. BaseCommunity.dll
复制代码
,再次运行结果正常,只有另外三个DLL文件了。
最后再运行:
  1. @echo off
  2. Setlocal enabledelayedexpansion
  3. for /f %%a in ('dir D:\xunleivip\*.dll /a-d /b|findstr /v /i /g:"d:\list.txt"') do (echo del /q "D:\XUNLEIVIP\%%a")
  4. pause
复制代码
,结果xunleivip文件夹里所有的DLL文件都在,一个都没有删除,是不是我哪里搞错啦?
作者: 窄口牛    时间: 2018-9-25 15:07
列表内容不要路径,一行一个。
作者: 双响炮    时间: 2018-9-25 15:17
窄口牛 发表于 2018-9-25 15:07
列表内容不要路径,一行一个。

对对,列表内容去掉路径后查看确实就正常了,可是不删除是咋回事?
作者: 窄口牛    时间: 2018-9-25 15:59
echo去掉,才会删除。汗。
作者: 双响炮    时间: 2018-9-25 16:32
窄口牛 发表于 2018-9-25 15:59
echo去掉,才会删除。汗。

没用,这个我自己也发现了,去掉ECHO也不删除。
作者: 窄口牛    时间: 2018-9-25 16:51
那就奇怪了,each出来也没问题吧?
作者: 双响炮    时间: 2018-9-25 19:03
窄口牛 发表于 2018-9-25 16:51
那就奇怪了,each出来也没问题吧?

不如我直接传附件上来,牛大试试 list.rar (710.85 KB, 下载次数: 11)
作者: 窄口牛    时间: 2018-9-26 08:11



  1. @echo off
  2. Setlocal enabledelayedexpansion
  3. for /f %%a in ('dir D:\xunleivip\*.dll /a-d /b^|findstr /v /i /g:"d:\list.txt"') do (
  4. del /q "D:\XUNLEIVIP\%%a"
  5. )


  6. pause>nul
复制代码

作者: 双响炮    时间: 2018-9-26 09:47
窄口牛 发表于 2018-9-26 08:11

回家就重装系统,昨天就怀疑了,再次感谢牛大的耐心指导!!!
作者: nttwqz    时间: 2018-9-26 13:36
双响炮 发表于 2018-9-26 09:47
回家就重装系统,昨天就怀疑了,再次感谢牛大的耐心指导!!!

好几次了,难道你都没有发现?|前面是需要有转义符号的

还有一种方法,文件属性法,给保留的文件添加只读隐藏系统属性,del命令默认无法删除这些属性的文件,然后再取消属性就可以了
作者: 双响炮    时间: 2018-9-26 19:55
nttwqz 发表于 2018-9-26 13:36
好几次了,难道你都没有发现?|前面是需要有转义符号的

还有一种方法,文件属性法,给保留的文件添加 ...

受教受教,又学习了好多
作者: 又捡一只猫    时间: 2018-10-29 18:08
想赚点零用钱。给家庭减少一点负担。加我微信:wiyu098或者hanhanling3366 不会让你们失望的噢!!





欢迎光临 无忧启动论坛 (http://wuyou.net/) Powered by Discuz! X3.3