Как проверить, существует ли каталог в Windows?

59

Я хотел бы перевести этот скрипт Linux / Bash в оболочку Windows:

if test -d myDirName; then echo "ok"; else mkdir myDirName; fi

Он проверяет, существует ли каталог, а если нет, то создает его.

Pietro
источник
3
Фактическая команда линукс / баш будет просто: mkdir -p myDirName. Потратив дни на попытки перевести относительно простые bash-скрипты в batch-sh * t (присвоение результата функции переменной?), Я решил просто заставить людей установить cygwin.
Майкл

Ответы:

73
@echo off
IF exist myDirName ( echo myDirName exists ) ELSE ( mkdir myDirName && echo myDirName created)

Добавлено Barlop

Хотя вышесказанное работает для данной конкретной ситуации, в заголовке говорится о тестировании специально для каталога. Комментарий Фогга, if exist mydirname\а не if exist mydirnameспособ. Некоторые ответы использовали \ nul, но \ nul проблематичен в NT. Не включая завершающую обратную косую черту будет проверять файл или каталог. Так, для каталога, включите обратную косую черту.

Сатьяджит Бхат
источник
23
Это правильно для проверки существования файла, но как узнать, что это каталог? Самый простой ответ, if exist mydirname\ а остальное как вы говорите. С другой стороны, вы можете получить testдвоичный файл и использовать его в Windows.
Фогг
@phogg: в контексте этого конкретного вопроса: если он существует, но является файлом, вы все равно не можете mkdirэто сделать.
grawity
@grawity: Если он существует, но это файл, сценарий, вероятно, завершится неудачно позже при попытке использовать его в качестве каталога, что, вероятно, не то, что вам нужно.
Фогг
Как я могу проверить, если не существует?
Сунггук Лим
1
@sunglim, написав `Если не существует myDirName \` аналогично if not 1==1 echo hmm или если существует myDirName \ ELSE blahblahblah
barlop
20

Вот что я только что узнал:

Вы можете проверить, существует ли файл nul; если каталог существует, он будет содержать nul-файл, если nul-файл не существует, то каталог не существует.

IF exist myDirName/nul ( echo myDirName exists ) ELSE ( mkdir myDirName && echo myDirName created)
dev008
источник
2
+1 - это работает во всех версиях Windows и MS-DOS, в отличие от простой, if exist dirnameкоторая, кажется, специфична для Windows NT.
grawity
это глупый код по сравнению с linux mkdir -p myDirName: p
Kit Ho
6
Это должен быть обратный слеш, а не слеш.
Натан Гарабедян
@grawity Что вы думаете об этом, хотя, по-видимому, некоторые проблемы с \ nul? dostips.com/forum/viewtopic.php?f=3&t=4913
barlop
@barlop: Я думаю, что cmd.exe - один из худших существующих языков сценариев, и что следует использовать PowerShell или другие альтернативы, если это вообще возможно. Что касается того \nul, что в Windows NT больше нет необходимости, обычный if exist "C:\Program Files (x86)"должен работать (если вы все еще не нацелены на Windows 98 ...)
grawity
11

Используйте обратную косую черту, а не прямую косую черту: myDirName\nulнеmyDirName/nul

md foo 
echo.>bar 
for %I in (foo bar xyz) do @( 
  if exist %I ( 
    if exist %I\nul ( 
      echo -- %I is a directory 
    ) else ( 
      echo -- %I is a file 
    ) 
  ) else ( 
    echo -- %I does not exist 
  ) 
)

- foo - это каталог
- bar - это файл
- xyz не существует

редактировать: это работает, только если имя каталога не содержит пробелов

DVF
источник
5

Некоторые предлагали сделать \ nul, но в NT это не работает надежно

C:\blah>md abc

C:\blah>if exist abc\nul echo yes
yes

C:\blah>if exist "abc\nul" echo yes

C:\blah>

http://www.dostips.com/forum/viewtopic.php?f=3&t=4913

foxidrive writes-

The trick with nul worked in pre NT versions of windows.

Now you would use this, with a trailing backslash.

if exist "C:\abcde\" echo the folder exists

Ре вопрос

C:\blah>if exist "abcd\" (echo yes) else (echo no && mkdir abcd)
no

C:\blah>if exist "abcd\" (echo yes) else (echo no && mkdir abcd)
yes

C:\blah>
barlop
источник
4

Я задавался вопросом, почему у Джо было отрицательное мнение, поскольку у меня была такая же проблема в Windows 7, а именно, что

Если существует имя файла \ NUL

возвращал TRUE для файлов и каталогов. Я нашел альтернативное решение на www.robvanderwoude.com/battech_ifexistfolder.php и предложил пересмотренную версию цикла FOR DVF:

FOR %I in (foo bar xyz) DO @( PUSHD %I && (POPD & echo -- %I is a directory) || ( IF exist %I ( echo -- %I is a file ) ELSE ( echo -- %I does not exist ) ) )
Damian
источник
Это было единственное решение, которое сработало, спасибо. Я добавил "2> NUL", чтобы избежать сообщения об ошибке, и изменил значения эха на 1 (каталог существует), 0 (каталог не существует), -1 (файл с таким именем существует) FOR% A IN (" C: \ temp \ foo \ HELLO WORLD5 ") DO @ (PUSHD"% A "2> NUL && (POPD & ECHO 1) || (IF EXIST% A (ECHO -1) ELSE (ECHO 0
Кристоф
(извините, мне не удалось отформатировать код как код в ответе, хотя я пробовал так много вещей :-(, пока редактирование комментария не закончилось через 5 минут :-()
Кристоф
1

Я вижу, что у многих есть проблемы с различием между файлами и папками. Кто-нибудь пробовал просто войти в него после проверки его существования? Тогда CD будет либо успешным, либо неудачным.

set MyDir = "MyTestDir"
IF exist MyDir (
    cd MyDir 
    IF ERRORLEVEL NEQ 0 (
        echo "Error: %MyDir% already exists, but it is a file!"
        exit 1
    ) else (
        # Do not forget to cd back
        cd ..
    )
) else (
   # Did not exist yet, so create it.
   mkdir MyDir
)
Ричард Ромбоутс
источник
(1) Если вы собираетесь использовать переменную, используйте переменную. Все вхождения MyDirпосле первой строки должны быть %MyDir%. (2) Не cd ..будет делать то, что вы хотите, если %MyDir%это многоуровневое имя пути (например, Pictures\cats) или даже абсолютный путь (например, \Windows). Подумайте об использовании pushd/ popdи / или setlocal.
Скотт
0
exist myDirName/nul

также верно, если myDirName - это файл, то есть не найденная функциональность

Джо
источник
1
C:\blah>touch abe<ENTER>C:\blah>if exist abe\nul echo err<ENTER> C:\blah>if exist abe/nul echo err<ENTER>C:\blah>я не фанат \ nul в NT, но это не так. Вы должны были дать какой-то вывод.
Barlop
-1

Поиск папки не должен быть таким сложным. Мое решение, используйте Perl:

для ($ cnt = $ # ARGV; $ cnt> = 0; - $ cnt)
{
   if (-d "$ ARGV [$ cnt]") { 
      print "argv [$ cnt] = $ ARGV [$ cnt] является папкой \ n";
      $ dir = $ ARGV [$ cnt];
      сломать;
   } еще {
      print "argv [$ cnt] = $ ARGV [$ cnt] не является папкой \ n";
   }
}
user937229
источник
Я не понимаю
Pierre.Vriens