2010-12-06 16:36:13 +0000 2010-12-06 16:36:13 +0000
64
64

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

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

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

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

Ответы (9)

79
79
79
2010-12-06 16:47:52 +0000
@echo off
IF exist myDirName ( echo myDirName exists ) ELSE ( mkdir myDirName && echo myDirName created)

Добавлено Barlop

Хотя вышеописанное работает для этой конкретной ситуации, название говорит о тестировании специально для каталога. Комментарий Фогга, использующего if exist mydirname @echo off IF exist myDirName ( echo myDirName exists ) ELSE ( mkdir myDirName && echo myDirName created) `

Добавлено Barlop

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

21
21
21
2011-12-06 11:52:52 +0000

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

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

IF exist myDirName/nul ( echo myDirName exists ) ELSE ( mkdir myDirName && echo myDirName created)
11
11
11
2012-05-12 15:36:37 +0000

Используйте обратный слеш, а не прямой слэш: 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 - каталог – бар - файл – xyz не существует

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

5
5
5
2014-06-03 11:10:57 +0000

Некоторые предлагали сделать \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

Re the question

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
4
4
2013-10-11 11:29:44 +0000

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

IF EXIST filename\NUL

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

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 ) ) )
```.
1
1
1
2014-06-03 09:50:53 +0000

Я вижу много проблем с разграничением файлов и папок. Кто-нибудь пытался просто вставить cd в него после проверки его существования? Тогда 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
)
0
0
0
2019-11-09 14:56:24 +0000

Я предпочитаю использовать dir /d | findstr \[\.\.\]:

2>nul dir /d "myDirName" | findstr \[\.\.\] >nul && echo= "ok" || mkDir myDirName&&echo= Is NOT dir

2>nul dir /d "myDirName" | findstr \[\.\.\] >nul && echo= "ok" || mkDir myDirName
  • *

For create if exist or not and for ignore error…

2>nul mkDir myDirName

Также …

&00001

0
0
0
2012-05-04 10:41:48 +0000
exist myDirName/nul

также верно, если myDirName является файлом, а не функцией поиска.

-1
-1
-1
2018-08-24 18:31:30 +0000

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

for($cnt=$#ARGV; $cnt\>=0; --$cnt) { if ( -d "$ARGV[$cnt]" ) { print "argv[$cnt]=$ARGV[$cnt] is a folder\n"; $dir = $ARGV[$cnt]; break; } else { print "argv[$cnt]=$ARGV[$cnt] is Not a folder\n"; } }
```.

Похожие вопросы

3
28
13
7
3