双响炮 发表于 2018-9-24 09:06:54

如何根据LIST.TXT列表保留文件夹的文件写个批处理

本帖最后由 双响炮 于 2018-9-24 09:15 编辑

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

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

for /f "delims=" %%a in ('dir /a-d/s/b "%SrcDir%\*"') do (
    for /f "delims=" %%b in ('findstr /i"^%%~b$" "%LstFile%"' ) do (
         if not "%%~nxa"=="%%b (echodel /f /q "%%~a")
    )
   rd "%%~dpa"
)
echo end ...
pause

窄口牛 发表于 2018-9-24 10:49:50

可能是我老了,理解力不够了。没看懂你的逻辑,大概猜的是:只留下单只后缀名的文件?


只留下一个文件?

双响炮 发表于 2018-9-24 14:06:28

可能我表达得不清楚,上图说明一下:

在文件夹xunleivip中要删除的是除了basecommunity.dll和downloadkernel.dll之外的所有后缀名为.dll的文件,其它文件和文件夹均保留

窄口牛 发表于 2018-9-24 14:40:36

本帖最后由 窄口牛 于 2018-9-24 14:43 编辑

@echo off
Setlocal enabledelayedexpansion
for /f %%a in ('dir D:\XUNLEIVIP\*.dll /a-d /b^|findstr /v "basecommuny.dll downloaderkernel.dll"') do (
echo del /q D:\XUNLEIVIP\%%a
)

Eisan 发表于 2018-9-24 18:40:24

这个要mark 学习一下。

双响炮 发表于 2018-9-24 20:09:38

窄口牛 发表于 2018-9-24 14:40


老大这个方法应该可行,可是如果我的LIST.TXT的文件很多就不适用了,是吧

nttwqz 发表于 2018-9-24 20:29: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:17

可以的,findstr支持多字段。

双响炮 发表于 2018-9-24 21:14:41

nttwqz 发表于 2018-9-24 20:29
尝试将findstr /v "basecommuny.dll downloaderkernel.dll" 改成

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

不行,没任何反应

双响炮 发表于 2018-9-24 21:21:19

窄口牛 发表于 2018-9-24 21:14
可以的,findstr支持多字段。

我的意思是说不能把所有的保留文件都在批处理中列出来 呀,不然那个LIST.TXT文件就失去意义了

nttwqz 发表于 2018-9-24 22:57:28

双响炮 发表于 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内容

^
^

窄口牛 发表于 2018-9-25 08:22:11

老大的也没错,应该可以的。

双响炮 发表于 2018-9-25 14:31:01

nttwqz 发表于 2018-9-24 22:57
呃~ 你都不会多试一下,牛大的思路没有问题

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


我做了个简单的测试,在xunleivip目录下拷贝了4个.DLL文件,分别是:BaseCommunity.dll,DownloadClient.dll,DownloadKernel.dll,DownloadServer.dll
然后新建了一个list.txt文件,内容为:d:\xunleivip\BaseCommunity.dll
先试着运行dir D:\xunleivip\*.dll /a-d /b|findstr /v /i /g:"d:\list.txt",发现运行结果是4个.DLL文件,并没有排除BaseCommunity.dll,
后来修改了list.txt文件的内容为:BaseCommunity.dll,再次运行结果正常,只有另外三个DLL文件了。
最后再运行:@echo off
Setlocal enabledelayedexpansion
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")
pause,结果xunleivip文件夹里所有的DLL文件都在,一个都没有删除,是不是我哪里搞错啦?

窄口牛 发表于 2018-9-25 15:07:28

列表内容不要路径,一行一个。

双响炮 发表于 2018-9-25 15:17:22

窄口牛 发表于 2018-9-25 15:07
列表内容不要路径,一行一个。

对对,列表内容去掉路径后查看确实就正常了,可是不删除是咋回事?

窄口牛 发表于 2018-9-25 15:59:22

echo去掉,才会删除。汗。

双响炮 发表于 2018-9-25 16:32:02

窄口牛 发表于 2018-9-25 15:59
echo去掉,才会删除。汗。

没用,这个我自己也发现了,去掉ECHO也不删除。

窄口牛 发表于 2018-9-25 16:51:02

那就奇怪了,each出来也没问题吧?

双响炮 发表于 2018-9-25 19:03:32

窄口牛 发表于 2018-9-25 16:51
那就奇怪了,each出来也没问题吧?

不如我直接传附件上来,牛大试试

窄口牛 发表于 2018-9-26 08:11:49




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


pause>nul

双响炮 发表于 2018-9-26 09:47:40

窄口牛 发表于 2018-9-26 08:11


回家就重装系统,昨天就怀疑了:dizzy:,再次感谢牛大的耐心指导!!!

nttwqz 发表于 2018-9-26 13:36:01

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

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

还有一种方法,文件属性法,给保留的文件添加只读隐藏系统属性,del命令默认无法删除这些属性的文件,然后再取消属性就可以了

双响炮 发表于 2018-9-26 19:55:16

nttwqz 发表于 2018-9-26 13:36
好几次了,难道你都没有发现?|前面是需要有转义符号的

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

受教受教,又学习了好多{:1_194:}

又捡一只猫 发表于 2018-10-29 18:08:16

想赚点零用钱。给家庭减少一点负担。加我微信:wiyu098或者hanhanling3366 不会让你们失望的噢!!
页: [1]
查看完整版本: 如何根据LIST.TXT列表保留文件夹的文件写个批处理