【问题标题】:How to detect if folder is not empty (Windows Batch File)?如何检测文件夹是否为空(Windows 批处理文件)?
【发布时间】:2017-09-10 13:19:54
【问题描述】:

使用与 Windows 7 中的命令处理器兼容的简单批处理文件,如何检测文件夹是否有任何内容(即一个或多个文件或子文件夹,即不为空)?

我试过了:

IF EXIST C:\FOLDERNAME\* GOTO ROUTINE

但这总是返回TRUE,因此转到ROUTINE

如何做到这一点?

【问题讨论】:

    标签: windows batch-file cmd windows-7 console


    【解决方案1】:
    dir /A /B "C:\FOLDERNAME" | findstr /R ".">NUL && GOTO ROUTINE
    

    如果至少有一行输出,则目录不为空。
    findstr /R "." 导致成功退出代码,&& 将执行 goto routine

    【讨论】:

    • 我建议您使用DIR /A 选项来确保它不会遗漏,例如隐藏的项目。 DIR/B/A "C:\FOLDERNAME"2>NUL|FINDSTR .*>NUL&&GOTO ROUTINE
    • 您的答案试图解决另一个问题,而不是作者提出的问题。他认为包含一些(甚至是空的)子文件夹的文件夹是非空的,而您只查找文件(并以递归方式执行此操作)。虽然你对“空”的理解也有道理,但与题主的理解不同,对他来说dir /A /B "C:\FOLDERNAME" | findstr . >NUL && GOTO ROUTINE就够了,更正确。此外,您的实现假定目录名从不包含.,文件名始终包含.,但事实并非如此。
    • 哎哟。我注意到 user2956477 的 the original answer 是完全正确的,但是社区用户 changed it 以奇怪的方式。请有人恢复到原始 user2956477 的版本
    • 这个代码形式ss64怎么样:ss64.com/nt/empty.html
    • 最后,findstr /L "." 使用这个文件夹名称 A.B.C,其中包含点。
    【解决方案2】:

    我比较喜欢的方案是遍历目录下的文件,然后遍历每个文件的属性,得到它的大小,看看是否大于0。

    我制作的以下脚本验证了以下内容:

    • 如果指定的目录存在。
    • 文件夹是否包含文件。
    • 如果文件夹包含大于 0 字节的文件。

    如果没有文件或文件不超过0字节,脚本将报告该目录不包含任何文件。

    要运行脚本,您必须使用以下命令,其中“C:/path”是要检查的目录:

    start name.bat "C:/path"

    重命名脚本并更改目录。


    蝙蝠脚本:

    @echo off
    
    REM Command to launch the script:
    REM >> start name.bat "C:/path"
    
    REM Check if path exist
    if exist %1 (
    
        REM Loop in dir files
        for /f "delims=" %%f in ('dir /a /b /s %1') do (
            
            REM Check file sizes
            for /f "usebackq delims=" %%s in ('%%f') do (
    
                REM Check if there is a file bigger than 0 bytes
                if %%~zs GTR 0 (
                    echo The directory is not empty
                    goto end
                )
            )
        )
        echo The directory is empty
    
    ) else (
        echo The directory does not exist
    )
    
    :end
    pause
    

    【讨论】:

    • 但是如果一个目录包含一个文件,它就不是空的,与文件大小无关
    • 如果您不需要此功能,只需删除第二个for,留下echogoto。就个人而言,我更喜欢考虑清空包含空文件的文件夹。
    • 您只能在目录为空时删除它——其中没有任何内容。顺便提一句。如果有以 ; 开头的文件或目录,您的代码将失败
    • 要从目录和子目录中删除所有文件,您可以使用del /F/Q/S *.* > nul,并且在文件和文件夹名称中使用特殊字符通常被认为是不好的做法。
    • C:\Program Files (x86), C:\Documents & Settings 由 Microsoft 命名。顺便提一句。即使这是不好的做法,函数也应该始终返回正确的值
    【解决方案3】:

    您可以将这样的内容放入批处理文件中(假设您知道该文件夹存在):

    FOR /F %%A IN ('DIR /A /B FolderName 2^>nul') DO GOTO NonEmpty
    GOTO Empty
    

    如果要测试文件夹是否包含文件(即忽略子文件夹),请将/A 更改为/A-D

    如果要测试文件夹是否包含子文件夹(即忽略文件夹中的文件),请将/A 更改为/AD

    【讨论】:

      猜你喜欢
      • 2013-07-18
      • 1970-01-01
      • 2011-08-09
      • 2010-12-12
      • 2011-10-21
      • 2017-02-13
      • 1970-01-01
      • 1970-01-01
      • 2016-03-22
      相关资源
      最近更新 更多