25楼的代码大致能解决问题
但是,如果环境比较复杂的话,还是会误删文件的
问题出在这一句:findstr /i /g:a.txt b.txt>c.txtCOPY 因为 findstr 是部分支持正则表达式的
用 /g:a.txt 从a.txt文件中获取到的字符串几乎每行都含有点号,而点号能匹配任意一个字符
形如 1.pdf 的名称是能和 1Xpdf 这样的字符串匹配的
当 b.txt 中字符串的组成规律足够复杂,出错的几率会很高
另外,从a.txt中获取到的字符串,findstr无法限定它们是否位于绝对路径的最后一层,并且不能限定之后是否包含其他字符
搜索 1.pdf 的时候,能匹配到 d:\test\11.pdf ,也能匹配到 d:\test1.pdf\a.pdf
所以,需要对a.txt中的字符串做进一步处理
当 findstr /g:a.txt 的时候,使得那些特殊字符失去正则意义而回归普通字符的含义,且能限定该字符串等于完整路径的最后一层
一个可行的办法是:
把 a.txt 中每行字符的点号用 \. 来替换,行首添加字符 ^ ,行尾添加字符$
需要用 gsed.exe 进行处理
在25楼的基础上修改如下: | @echo off | | md backup 2>nul | | ::将下一行的crc32.txt替换为实际的文件名 | | (for /f "tokens=1*" %%a in (crc32.txt) do ( | | if defined %%a (echo,%%b) else set %%a=1 | | ))>a.txt | | gsed "s/\./\\./g;s/^/\\\\/;s/$/\$/" a.txt>b.txt | | dir /s /b /a-d>c.txt | | findstr /i /g:b.txt c.txt>d.txt | | for /f "delims=" %%a in (d.txt) do move /y "%%a" backup\ | | del a.txt b.txt c.txt d.txtCOPY |
gsed 可以去这里下载:http://www.bathome.net/thread-16975-1-1.html |