【发布时间】:2017-09-10 13:19:54
【问题描述】:
使用与 Windows 7 中的命令处理器兼容的简单批处理文件,如何检测文件夹是否有任何内容(即一个或多个文件或子文件夹,即不为空)?
我试过了:
IF EXIST C:\FOLDERNAME\* GOTO ROUTINE
但这总是返回TRUE,因此转到ROUTINE。
如何做到这一点?
【问题讨论】:
标签: windows batch-file cmd windows-7 console
使用与 Windows 7 中的命令处理器兼容的简单批处理文件,如何检测文件夹是否有任何内容(即一个或多个文件或子文件夹,即不为空)?
我试过了:
IF EXIST C:\FOLDERNAME\* GOTO ROUTINE
但这总是返回TRUE,因此转到ROUTINE。
如何做到这一点?
【问题讨论】:
标签: windows batch-file cmd windows-7 console
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就够了,更正确。此外,您的实现假定目录名从不包含.,文件名始终包含.,但事实并非如此。
findstr /L "." 使用这个文件夹名称 A.B.C,其中包含点。
我比较喜欢的方案是遍历目录下的文件,然后遍历每个文件的属性,得到它的大小,看看是否大于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 命名。顺便提一句。即使这是不好的做法,函数也应该始终返回正确的值
您可以将这样的内容放入批处理文件中(假设您知道该文件夹存在):
FOR /F %%A IN ('DIR /A /B FolderName 2^>nul') DO GOTO NonEmpty
GOTO Empty
如果要测试文件夹是否包含文件(即忽略子文件夹),请将/A 更改为/A-D。
如果要测试文件夹是否包含子文件夹(即忽略文件夹中的文件),请将/A 更改为/AD。
【讨论】: