Test if Directory exists in Batch file (.cmd)

My previous post on testing network drives led me to further research the topic, and I came to quite surprising (at least for me) results: the result if a check with IF EXIST depend on whether

  • the drive is a local drive or a mapped network drive or a UNC path
  • the path contains spaces or not
  • the path is quoted or not
  • cmd runs in administrator mode or user mode

I wrote a small batch file that contains a couple of assignments of the form

set dir=c:\temp
set dir=c:\temp\with spaces

and executed these tests on each value

if exist %dir% echo exists
if exist %dir%\nul echo exists
if exist %dir%\. echo exists
if exist "%dir%" echo exists
if exist "%dir%\nul" echo exists
if exist "%dir%\." echo exists

These are the results

directory %dir% %dir%\nul %dir\. “%dir%” “%dir%\nul” “%dir%\.”
local x x x x x
local (spaces) x x
mapped (non-admin) x x x x x
mapped (non-admin, spaces) x x
UNC x x x x x x
UNC (spaces) x x x


Testing directory path containing spaces can only be performed using the quoted notation.

Mapped network drives can only be access in non-administrator mode (see these threads).

The only reliable way to test for directory existence is therefore to use the quoted “%dir%\.” notation.

To check whether cmd runs in administrator mode or not, use an admin statement such as ‘at’:

at >nul 2>nul
if errorlevel 1 echo you are not in administrator mode

10 Responses to Test if Directory exists in Batch file (.cmd)

  1. Batch file developer says:

    This article has been very helpful in debugging a few problems I had with testing for directories…. thank you so much!!!

  2. […] most hits up to today are related to batch programming, which is not really one of my core areas: Test if Directory exists in Batch file (.cmd) and Test if Network Directory exists in Batch […]

  3. Greg says:

    Batch is such a mess. Thanks for this.

  4. Thank you for sharing.

    I also found that “%dir%\..” and “%dir%\*” also works .

    (and if you already quote when setting %dir%, the test exist will not need quote)

  5. John Anson says:

    For me: if exist c:\Windows\write.exe\. echo y
    Prints “Y”.
    \. returns true for files as well

  6. […] Test if Directory exists in Batch file (.cmd) […]

  7. For those who wanted to differentiate between FILE and DIRECTORY (both in quotes because of long name) to be tested:

    IF Exist “DIR\” ECHO Exists


  8. It is obvious that BATCH programming is reaching it’s end of life. MS seems not be supporting this anymore and batch programming stays behind all the new features being introduced in newer OS versions, becoming incompatible with it. Sure, basic things can be easily achieved using BATCH, but more sophisticated scripts that worked best lately in Windows XP are becoming worse and worse manageable and even slight inconsistency in different language OS/regional settings makes any script dependent on it to fail. e.g. DATE result, PING result, now files/dirs not being recognized by EXIST command …. it is the end.
    Time to move on to another programming language. PowerShell for Windows environment…. may be.
    Or AutoIt…

  9. John says:

    Unfortunately, dir “\folder\.” will not work if the “folder” is actually a junction (vs a real directory). Example: c:\documents and settings\” on a Win 7 machine.

  10. Adolfo says:

    Your solution works better than the classic

    if exist “%~1\nul” echo FOO

    At least in Win8.1 yours handles correctly file names with spaces.

    Maybe I wil have to change all my MSdos.bat files… Thanks!

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: