我有两个驱动器,假设驱动器 A (F:) 和驱动器 B (G:)。我曾经将驱动器 B 的所有内容复制到驱动器 A。但之后驱动器 B 中添加了一些新文件和文件夹。我想从驱动器 B 中删除重复的文件和文件夹,只保留驱动器 A 中不存在的文件和文件夹。
我尝试了下面的命令来检查是否找到了重复项,但它没有按我想要的方式工作,因为它在变量中有完整路径%%a
。当然,如果它有效的话,现在的输出echo %%a
将被等效的替换。DEL
@echo off
for /F "tokens=*" %%a in ('dir G:\*.* /b /s') do if not exist "F:\%%a" echo %%a >> C:\Users\billy\Desktop\files.txt
pause
如果我/s
从dir
命令中删除开关,它就会起作用,因为它%%a
只有文件名而不是完整路径,但它不能对子文件夹递归工作,所以它没那么有用。
答案1
@echo off
for /F "delims=" %%a in ('
dir G:\*.* /b /s /A:-D
') do if not exist "F:%%~pnxa" echo del "%%~a" >> C:\Users\billy\Desktop\files.txt
pause
解释:
/A:-D
从列表中排除目录(文件夹),因为后续del
命令将删除文件而不是目录(按照del /?
:如果指定了目录,则目录中的所有文件都将被删除,但文件夹本身不会被删除);- 分开处理文件夹:使用另一个与开关
for /F
相反但在这种情况下使用而不是命令来dir
/A:D
rd
del
删除文件夹;用于rd /S
删除整个文件夹树(除文件夹本身之外的所有文件和子文件夹)。 %%~pnxa
扩展%%a
至完整路径+名称+扩展名包括一个前导\
(无G:
磁盘规范);del "%%~a"
双引号完整路径,以便正确处理带有空格的路径;- 我建议
"delims="
不要"tokens=*"
正确处理文件名中可能出现的前导空格(无需任何标志即可实现/S
); - 考虑额外的命令行开关(参见
del /?
和rd /?
)。