如何在批处理文件当前目录的不同目录中删除0字节的文件?

时间:2015-01-08 16:15:59

标签: batch-file

我正在尝试创建一个删除0字节文件的批处理文件。我目前有以下代码:

@echo off 
setLocal EnableDelayedExpansion 
for /f "tokens=* delims= " %%a in ('dir/s/b/a-d') do ( if %%~Za equ 0 del "%%~a" )

这是通过删除0字节的文件来正常工作,但只能在批处理文件的当前目录中。

我希望使用代码删除bat文件当前目录的不同目录中的0字节文件进行一些增强。

请帮助我!

3 个答案:

答案 0 :(得分:1)

只需在循环浏览文件之前更改到要使用的目录,即可轻松解决此问题:

@echo off 
setLocal EnableDelayedExpansion 
set CWD=%CD%
cd /d %1
for /f "tokens=* delims= " %%a in ('dir/s/b/a-d') do ( if %%~Za equ 0 del "%%~a" )
cd /d %CWD%

(有关更改目录的信息,另请参阅How do I find the current directory of a batch file, and then use it for the path?。)

现在你只提到批处理文件的当前目录"。如果从Windows资源管理器中单击批处理文件而不是从命令提示符调用它,则会发生这种情况。那是你在做什么的?如果您希望批处理文件询问该用户使用的目录,而不是将其作为参数,就像我在之前的代码中所做的那样,那么您必须为此编写代码也:

@echo off 
setLocal EnableDelayedExpansion 
set CWD=%CD%
set /p D=What directory should I clean?
cd /d %D%
for /f "tokens=* delims= " %%a in ('dir/s/b/a-d') do ( if %%~Za equ 0 del "%%~a" )
cd /d %CWD%

答案 1 :(得分:0)

您可以直接在命令中包含目标目录名:

for /f "delims=" %%a in ('dir/s/b/a-d "d:\your directory\name\wherever\*.*"') do ( if %%~Za equ 0 ECHO del "%%~a" )

注意:

=设置中的"delims之间应该有空格。如果您在那里包含空格,那么如果有一个名为file name.txt的文件,file将被分配给%%a。由于dir /s/b的输出包含路径,因此绝对文件名d:\some dir\file name.txt会将d:\some分配给%%a并对该文件执行操作,即使它位于您想要的子树之外扫描。

tokens=*只是删除了前导空格,这些空格不会出现dir/s/b,因此是多余的。

我在echo中添加了以显示将被删除的文件名。这是一个安全的"选项 - 首先显示名称,以便在出现错误时不会造成损坏。一旦您满意,选择了正确的选择,请删除echo关键字以实际删除文件。

另一种(但类似的)方式是

set "targetdir=d:\your directory\name\wherever"
for /f "delims=" %%a in ('dir/s/b/a-d "%targetdir%\*.*"') do ( if %%~Za equ 0 ECHO del "%%~a" )

其中targetdir只是一个方便的描述性名称。这更灵活,因为如果您愿意,可以使用代码在targetdir中构造值。

当然,*.*只是all files的文件掩码。如果您只想处理.txt个文件,请将*.*替换为*.txt

答案 2 :(得分:0)

我从来没有像很多人建议的那样对FOR感到好运,我通常使用FORFILES:

@echo off
FORFILES /P "C:\Path" /C "CMD /C IF @FSIZE==0 del @FILE"