如何检测文件夹是不是为空(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
,留下echo
和goto
。就个人而言,我更喜欢考虑清空包含空文件的文件夹。
您只能在目录为空时删除它——其中没有任何内容。顺便提一句。如果有以 ;
开头的文件或目录,您的代码将失败
要从目录和子目录中删除所有文件,您可以使用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 批处理文件)?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 windows phone 8.1 中检查文件夹是不是为空