How can I check if a folder is empty in bat file?

  • Thread starter Thread starter Dmitry Anikin
  • Start date Start date
D

Dmitry Anikin

I'm using win xp sp2.
The folder exists, that I know for sure, but I must know if it contains any file or subfolder.
Is there any SIMPLE way to do it????

I tried:
if exists folder\*.*
if exists folder\*
if exists folder\?
if exists folder\?.?
---- it always true, I think because there're always "." and ".." subfolders in a folder.

I could use something like: dir folder /b > tmpfile, then check whether tmpfile is empty
but it is very cumbersome and I (don't want) || (cannot ) use temp files.

I tried dir folder /b | set /p myvar=
But you cannot access myvar later, 'cause it's created in another context.
By the way, why doesn't this work:
dir folder /b | (set /p myvar= & echo %myvar%)
or
dir folder /b | (setlocal enabledelayedexpansion & set /p myvar= & echo !myvar!)
-it echoes string '!myvar!', although
dir folder /b | (set /p myvar= & set myvar)
shows that myvar really gets the name of first item in a dir

I tried xcopy /e folder\*.* nul and it always returns an error
although copy folder\*.* nul can be used and it returns errorlevel 1
if no file exists, but it doesn't care for subfolders! Also, copying a big
folder even to nul can be a performance problem.

for %%i in (folder\*) ---- doesn't check subdirs
if FOR checks subdirs (like in: for /r %%i in (.), for /d ...) it doesn't check files
For now I've settled for this:

for %%i in (folder\*) do goto notempty
for /d %%i in (folder\*) do goto notempty
rem here it's empty
goto cont
:notempty
rem and here it is not

but it's way too complex for such an easy task,
and also FOR doesn't check for hidden files.

Any suggestions?
 
Putting your thoughts to paper really improves thinking,
I've found a nicer way:

for /f %%i in ('dir /a /b folder') do goto notempty

And also it checks hidden files.
But still, I'd like something which could be used in an IF
 
Putting your thoughts to paper really improves thinking,
I've found a nicer way:

for /f %%i in ('dir /a /b folder') do goto notempty

And also it checks hidden files.
But still, I'd like something which could be used in an IF

set pipe="%TEMP%\Found_%RANDOM%.TMP"
dir /a /b folder>%pipe% 2>&1
set OK=Y
for /f "Tokens=*" %%f in ('type %pipe%^|FINDSTR /B /L /C:"File Not Found"') do set OK=N
if "%OK%" EQU "N" goto MT


Jerold Schulman
Windows Server MVP
JSI, Inc.
http://www.jsiinc.com
 
Within a script, use the following (no doubt inadvertently line wrapped)
one-liner:

if not "%~f1"=="" for /f %%e in ('dir "%~f1\*" /b/a') do goto
:LABELINDICATINGDIRECTORYNOTEMPTY

Create a label named accordingly that handles your requirements when the
directory is not empty.
 
Having sync'd my newsgroups it seems you'd already found that one ... or
a close derivative!

I've since taken another look at using the "if" statement to achieve
your goal and found many other way to get there, none of which use "if"
exclusively ... there may well be a creative way but I've yet to find it
I'm afraid!

Sorry ... Dean
 
I tried:
if exists folder\*.*
if exists folder\*
if exists folder\?
if exists folder\?.?

use this:

IF EXIST "C:\Windows"

or

IF /I EXIST "C:\Windows"

or (not 100% sure)

IF EXIST "C:\Windows\Nul"


Alex
 
alex said:
use this:

IF EXIST "C:\Windows"

or

IF /I EXIST "C:\Windows"

or (not 100% sure)

IF EXIST is not case sensitive - it doesn't do a string comparison between
the name in the script and the correctly capitalized name of a file whose
name contains the same characters but of a different case, so the /I is not
applicable.
IF EXIST "C:\Windows\Nul"

I think the problem here is that in 9x and earlier:

- if exist folder ALWAYS failed;
- no actual file or folder could exist with the name NUL;
- every actual folder contained an instance of every device, including NUL

This differentiation, as embodied in the "...\nul" trick you mention, made
it possible to determine if a potential name referred to:

- an actual file
- an actual folder
- a non-existent file or folder.

Since IF EXIST returns true for folders and files with NT and up, it is now
a little trickier to make this same determination.

/Al
 
Back
Top