我有一个非常简单的 .bat 脚本来清理文件夹中的 0 字节文件:
@echo off
FORFILES /P "E:\Path" /C "CMD /C IF @FSIZE==0 del @FILE /Q"
问题是,它正在删除不是 0 字节的文件,并且还删除了子文件夹中的所有文件,即使我没有使用 /S 开关。
我有一个非常简单的 .bat 脚本来清理文件夹中的 0 字节文件:
@echo off
FORFILES /P "E:\Path" /C "CMD /C IF @FSIZE==0 del @FILE /Q"
问题是,它正在删除不是 0 字节的文件,并且还删除了子文件夹中的所有文件,即使我没有使用 /S 开关。
你可以这样做for
:
@echo off
for /r %%A in (*.*) do if %%~zA==0 del "%%~fA" /q
这样,您将循环查找目录和子目录中的每个文件,并使用%%~zvar
(在这种情况下%%~zA
) 获取其大小。
然后,使用 anif
查看大小是否等于 0 字节。如果是,它将删除空文件。
这是另一种for 循环方法,它使用robocopy和findstr来选择 0 字节文件作为In
命令。我发现选择该块中的所有文件而不是逐一过滤该Do
部分中的所有文件更有效。
如果您只删除顶级目录本身中的那些:
@For /F Tokens^=1* %%G In ('^""%__AppDir__%Robocopy.exe" "E:\Path" NULL /L /NC /NDL /NJH /NJS^|"%__AppDir__%findstr.exe" /RC:"^[\ \ ]*0[\ ]"^"')Do @Del /A/F "%%H"
或者,如果您想删除子目录中的那些,只需在命令中添加/S
选项:Robocopy.exe
@For /F Tokens^=1* %%G In ('^""%__AppDir__%Robocopy.exe" "E:\Path" NULL /L /NC /NDL /NJH /NJS /S^|"%__AppDir__%findstr.exe" /RC:"^[\ \ ]*0[\ ]"^"')Do @Del /A/F "%%H"
只是为了确保板格式不会破坏上述示例,findstr匹配应该是:
^[\TAB\SPACE]*0[\TAB]