【问题标题】:How to delete files of 0 bytes in different directory of batch files current directory?如何删除批处理文件当前目录不同目录中的0字节文件?
【发布时间】:2015-03-06 20:01:58
【问题描述】:

我正在尝试制作一个删除 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字节文件的代码进行一些增强。

请帮帮我!

【问题讨论】:

    标签: batch-file


    【解决方案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%
    

    【讨论】:

    • 使用pushdpopd 比捕获%CD% 和使用cd 更干净...
    【解决方案2】:

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

    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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2018-08-22
        • 2013-06-08
        • 1970-01-01
        • 2011-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-13
        相关资源
        最近更新 更多