我有一些进程会在一个目录及其子目录中创建一些0KB大小的文件。
如何使用Windows命令提示符从文件系统中删除这些文件?
任何一个能够完成任务的单个命令或脚本都可以工作。
我只能运行简单的cmd命令和脚本,而且受到访问限制的远程机器上进行操作。
递归迭代文件:
for /r %F in (*)
查找零长度文件:
if %~zF==0
删除它们:
del "%F"
把它们整合在一起:
for /r %F in (*) do if %~zF==0 del "%F"
如果您需要在批处理文件中使用此命令,那么您需要将%
符号加倍:
for /r %%F in (*) do if %%~zF==0 del "%%F"
注意:我假设你的意思是长度恰好为 0 字节的文件。如果你所指的 0 KB 意味着任何小于 1000 字节的文件,则上面的 if
需要更改为 if %~zF LSS 1000
或其他你设定的阈值。
@if
。 - Kipif %%~zF==0
只会捕获空文件。 - Joey%%~zF==0
,但与文件资源管理器中的 size:empty
搜索相比,结果仍然不同。 - Foad S. Farimani@echo off
setLocal EnableDelayedExpansion
for /f "tokens=* delims= " %%a in ('dir/s/b/a-d') do (
if %%~Za equ 0 del "%%a"
)
来源于: 链接文本 看起来很有效,但有一个小问题:它无法删除文件名中带有空格的文件。可能有一种解决方法,但很抱歉,批处理不是我的长项。
for
将会进行标记化。我猜,del "%%a %%b"
应该可以工作。但实际答案是,除非绝对必要(例如用于排序),否则不要在dir
的输出上使用for /f
。for
本身可以迭代文件,并且以这种方式更加健壮。例如,如果控制台窗口选择了光栅字体,则你的解决方案无法处理包含OEM代码页中没有表示的Unicode字符的文件名。这些交互虽然微妙,但我倾向于远离for /f
来处理文件名。 - Joey当纠正了一个错别字时,这个程序可以正常工作。问题是缺少了波浪号(~),例如,del "%%a" 需要改为 del "%%~a"
由于将令牌括在“双引号”中,因此这确实会删除名称中带有空格的文件 - 另一种方法是使用“短名称”,如第二个示例所示[ %%~sa
@echo off setLocal EnableDelayedExpansion for /f "tokens=* delims= " %%a in ('dir/s/b/a-d') do ( if %%~Za equ 0 del "%%~a" )
@echo off setLocal EnableDelayedExpansion for /f "tokens=* delims= " %%a in ('dir/s/b/a-d') do ( if %%~Za equ 0 del %%~sa )
for
命令扫描目录树以查找文件,使用findstr
命令搜索文件中的 "." 模式并删除不匹配的文件。 - Constantin