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


59

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

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

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


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)

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 не существует

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


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>

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 ) ) )

Это было единственное решение, которое сработало, спасибо. Я добавил "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";
   }
}

Я не понимаю
Pierre.Vriens
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.