BATCH IF EXIST任何事情都是正确的,即使对于空目录也是如此

时间:2014-03-12 11:21:33

标签: batch-file

这是我的问题。我需要检查某个目录是否包含另一个随机命名的目录,或者只是包含任何内容,或者它是空的。

即使测试目录为空,简单的IF EXIST测试也返回true:

C:\Users\user>dir /B .\a

C:\Users\user>if exist .\a\* echo true
true

我理解这是因为这些线:

C:\Users\user>dir /A:D .\a\ |findstr "<DIR>"
2014-03-12  11:26    <DIR>          .
2014-03-12  11:26    <DIR>          ..

这使得目录技术上不为空,因此我无法使用此方法来确定目录是否包含另一个目录。

在这里我没有想法。 那么,是否有一种简单的方法来测试目录是否包含另一个目录而不知道其名称?

感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

我无法找到一个非常简单的解决方案,但这并不是太糟糕。

@echo off
setlocal
set empty=1
for /d %%F in (.\a\*) do set "empty="
if defined empty (
  echo .\a does NOT contain another folder
) else (
  echo .\a contains another folder
)

可能不需要,但添加GOTO可以提高效率

@echo off
setlocal
set empty=1
for /d %%F in (.\a\*) do set "empty="&goto :break
:break
if defined empty (
  echo .\a does NOT contain another folder
) else (
  echo .\a contains another folder
)

修改

我喜欢r3ap3r approach。以下是基于此的各种有用测试的列表。

测试文件夹是否存在:

if exist .\a\ (echo folder exists) else echo folder does not exist

测试现有文件夹是否包含任何文件:

dir /b /a-d .\a\*|findstr . >nul&&echo folder contains files||echo folder does not contain files

测试现有文件夹是否包含文件夹:

dir /b /ad .\a\*|findstr . >nul&&echo folder contains folders||echo folder does not contain folders

测试现有文件夹是否为空(没有文件或文件夹):

dir /b /a .\a\*|findstr . >nul&&echo folder is not empty||echo folder is empty

答案 1 :(得分:2)

试试这个:

@echo off
( dir /b /a "C:\test\" | findstr . ) > nul && (
  echo Not Empty
) || ( echo Empty )

答案 2 :(得分:0)

@ECHO OFF
SETLOCAL
SET "emptydir=u:\q22349927"
MD %emptydir%
ECHO made an empty directory
DIR /b %emptydir%|FIND /v "" >nul 
IF ERRORLEVEL 1 (ECHO %emptydir% is empty) ELSE (ECHO %emptydir% is NOT empty)
ECHO add a directory
MD %emptydir%\nolongerempty
DIR /b %emptydir%|FIND /v "" >nul
IF ERRORLEVEL 1 (ECHO %emptydir% is empty) ELSE (ECHO %emptydir% is NOT empty)
ECHO add a file
dir>%emptydir%\file.txt
DIR /b %emptydir%|FIND /v "" >nul
IF ERRORLEVEL 1 (ECHO %emptydir% is empty) ELSE (ECHO %emptydir% is NOT empty)
ECHO remove the directory - just the file remains
RD %emptydir%\nolongerempty
DIR /b %emptydir%|FIND /v "" >nul
IF ERRORLEVEL 1 (ECHO %emptydir% is empty) ELSE (ECHO %emptydir% is NOT empty)
ECHO remove the file - nothing remains
DEL %emptydir%\file.txt
DIR /b %emptydir%|FIND /v "" >nul
IF ERRORLEVEL 1 (ECHO %emptydir% is empty) ELSE (ECHO %emptydir% is NOT empty)
RD %emptydir%

GOTO :EOF

这是一个演示如何...