如何检测文件夹是不是为空(Windows 批处理文件)?

Posted

技术标签:

【中文标题】如何检测文件夹是不是为空(Windows 批处理文件)?【英文标题】: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

如何做到这一点?

【问题讨论】:

【参考方案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

【讨论】:

以上是关于如何检测文件夹是不是为空(Windows 批处理文件)?的主要内容,如果未能解决你的问题,请参考以下文章

如何检测 SELECT 中的列是不是可以为空?

如何在 windows phone 8.1 中检查文件夹是不是为空

django表如何检测表是不是为空

检测 Windows 是不是已准备好下载/安装 Windows 更新的最佳方法?

如何检测 Windows 资源管理器是不是显示给定文件夹?

如何检测 Vue $router.back() 是不是已完成,而不是历史堆栈为空的情况?