使用一个简单的批处理文件,兼容Windows 7命令处理器,如何检测一个文件夹是否有内容(指一个或多个文件或子文件夹,即不为空)?
我尝试了以下代码:
我尝试了以下代码:
IF EXIST C:\FOLDERNAME\* GOTO ROUTINE
但是这总是返回TRUE
,从而进入ROUTINE
。
如何实现呢?
IF EXIST C:\FOLDERNAME\* GOTO ROUTINE
但是这总是返回TRUE
,从而进入ROUTINE
。
如何实现呢?
dir /A /B "C:\FOLDERNAME" | findstr /R ".">NUL && GOTO ROUTINE
findstr /R "."
命令执行成功并返回一个退出代码,接着使用 &&
来执行 goto routine
。@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
即可。就我个人而言,我更喜欢将包含空文件的文件夹视为空文件夹。 - Ariel Montesdel /F/Q/S *.* > nul
命令,并且在文件和文件夹名称中使用特殊字符通常被认为是不良做法。 - Ariel MontesC:\Program Files (x86)
和C:\Documents & Settings
是由微软命名的。顺便说一句,即使它是不好的实践,一个函数也应该始终返回正确的值。 - jebFOR /F %%A IN ('DIR /A /B FolderName 2^>nul') DO GOTO NonEmpty
GOTO Empty
如果你想要测试文件夹中是否包含文件(即忽略子文件夹),请将/A
更改为/A-D
。
如果你想要测试文件夹中是否包含子文件夹(即忽略文件夹内的文件),请将/A
更改为/AD
。
if exist *.???
的代码,因为在我的情况下,该文件夹中的文件总是有三个字符的扩展名......但这并没有起作用,因为?似乎匹配0个或多个,而不是1个或多个。它总是计算为真,即使文件夹中没有文件(我猜测是因为每个文件夹都包含名为“.”和“..”的文件夹)。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
)
DIR
命令的/A
选项,以确保不会错过隐藏的项目。DIR/B/A "C:\FOLDERNAME"2>NUL|FINDSTR .*>NUL&&GOTO ROUTINE
- Compodir /A /B "C:\FOLDERNAME" | findstr . >NUL && GOTO ROUTINE
就足够了,而且更正确。此外,你的实现假设目录名称从不包含“.”,文件名始终包含“.”,但这并不是真实情况。 - Sashafindstr /L "."
命令可以查找包含点号的文件夹名称为 **A.B.C
**。 - Matthew Wai