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

5
使用一个简单的批处理文件,兼容Windows 7命令处理器,如何检测一个文件夹是否有内容(指一个或多个文件或子文件夹,即不为空)?
我尝试了以下代码:
IF EXIST C:\FOLDERNAME\* GOTO ROUTINE

但是这总是返回TRUE,从而进入ROUTINE

如何实现呢?

4个回答

7
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 - Compo
你的回答试图解决的是与问题作者提出的不同的问题。他认为一个带有一些(甚至是空的)子文件夹的文件夹是非空的,而你只寻找文件(并且递归地执行此操作)。虽然你对“空”概念的理解也有道理,但它与问题作者的理解不同,对于他来说,dir /A /B "C:\FOLDERNAME" | findstr . >NUL && GOTO ROUTINE就足够了,而且更正确。此外,你的实现假设目录名称从不包含“.”,文件名始终包含“.”,但这并不是真实情况。 - Sasha
4
哎呀,我注意到用户2956477的原始答案完全正确,但随后社区用户以奇怪的方式修改了它。请有人恢复到原来的用户2956477版本 - Sasha
这个ss64的代码怎么样:https://ss64.com/nt/empty.html - Ricardo Bohner
在我的电脑上,使用 findstr /L "." 命令可以查找包含点号的文件夹名称为 **A.B.C**。 - Matthew Wai
@Sasha 我已将其恢复为正确答案并添加了解释。 - jeb

2
我倾向的解决方案是迭代目录中的文件,然后迭代每个文件的属性以获取其大小并查找是否大于0。
我制作的以下脚本验证了以下内容:
- 指定的目录是否存在。 - 文件夹是否包含文件。 - 文件夹是否包含大于0字节的文件。
如果没有文件或文件不超过0字节,则脚本将报告该目录不包含任何文件。
要运行脚本,您必须使用以下命令,其中“C:/path”是要检查的目录:
start name.bat "C:/path"
重命名脚本并更改目录。
Bat脚本:
@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

但是如果一个目录包含一个文件,那么它就不是空的,与文件大小无关。 - jeb
1
如果您不需要此功能,只需删除第二个 for 并保留 echogoto 即可。就我个人而言,我更喜欢将包含空文件的文件夹视为空文件夹。 - Ariel Montes
只有当目录为空时,才能删除该目录 - 里面没有任何东西。顺便说一下,如果以“;”开头的文件或目录存在,则您的代码将失败。 - jeb
要删除目录和子目录中的所有文件,您可以使用 del /F/Q/S *.* > nul 命令,并且在文件和文件夹名称中使用特殊字符通常被认为是不良做法。 - Ariel Montes
1
C:\Program Files (x86)C:\Documents & Settings是由微软命名的。顺便说一句,即使它是不好的实践,一个函数也应该始终返回正确的值。 - jeb
显示剩余7条评论

1
您可以在批处理文件中添加类似以下内容的代码(假设您知道该文件夹已存在):
FOR /F %%A IN ('DIR /A /B FolderName 2^>nul') DO GOTO NonEmpty
GOTO Empty

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

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


0
略有不同的答案,但我的搜索结果指向了这里,希望能对其他人有所帮助。
我的应用场景是:当当前文件夹中有文件时,我想运行一个exe文件。如果当前文件夹为空或只包含其他文件夹,则什么都不做。
一开始我尝试使用类似于if exist *.???的代码,因为在我的情况下,该文件夹中的文件总是有三个字符的扩展名......但这并没有起作用,因为?似乎匹配0个或多个,而不是1个或多个。它总是计算为真,即使文件夹中没有文件(我猜测是因为每个文件夹都包含名为“.”和“..”的文件夹)。
因此,我尝试了另一种方法,使用dir命令。在我的情况下,我发现findstr对结果没有影响(我认为是因为在我的情况下,dir /A-d /b 在dir中没有找到文件时返回"文件未找到",由于/A参数上的-D导致...因此findstr .始终返回true)。
在我的情况下,下面的语句完美地解决了问题。如果文件夹中有文件,则执行该命令;如果没有文件或只有其他文件夹,则不做任何操作。
cd c:\interesting_dir
dir /a-D /b>nul && (
  c:\path\to\program1.exe
  c:\path\to\program2.exe
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接