批量删除除递归之外的所有扩展名

时间:2016-08-21 02:00:30

标签: batch-file recursion

我需要以递归方式删除文件夹的内容,但特定扩展名除外 防止它被非办公室文件溢出。

我试过了:

@echo off
SET ROOTDIR=E:\Testdel\
for /f %%F in ('dir %ROOTDIR% /b /a-d ^| findstr /vile ".xls .xlt .xlm .xlsx .xlsm .xltx .xltm .ppt .pot .pps .pptx .pptm .potx .ppam .ppsx .sldx .sldm .pdf .xls .doc .dot .docx. .html .docm .dotb .docb .tiff .jpg .png .cdr .cpt .psd"') do del "%%F"

但它输出错误:

  

无法找到C:\ Users \ username \ New

知道为什么吗?

1 个答案:

答案 0 :(得分:2)

这是因为默认分隔符是delim=<tab><space>所以它按空格分割文件名。此外,如果要递归删除文件,则必须为/s指定dir标志。试试这个:

@echo off
set ROOTDIR=E:\Testdel\
for /f "delims=" %%F in ('dir %ROOTDIR% /s /b /a-d ^|findstr /vile ".xls .xlt .xlm .xlsx .xlsm .xltx .xltm .ppt .pot .pps .pptx .pptm .potx .ppam .ppsx .sldx .sldm .pdf .xls .doc .dot .docx .html .docm .dotb .docb .tiff .jpg .png .cdr .cpt .psd"') do del "%%F"

注意: Wikibooks - Windows Batch Scripting: Switches提到一般,交换机不能在单个斜杠后面累积。它还提到findstr命令是例外,并允许将/v /i /l /e合并为/vile作为快捷方式。这也意味着此处的订单并不重要,/vile = /live =任何其他排序(Mofi指出这一点)。可能还有其他命令支持这一点,但是因为它们是例外,所以将开关分开是一个好主意,因为这在所有情况下都会起作用并且会减少混淆。