我正在尝试创建一个删除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字节文件进行一些增强。
请帮助我!
答案 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"