57

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

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

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

8 ответов8

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

Добавлено Barlop

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

20

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

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

IF exist myDirName/nul ( echo myDirName exists ) ELSE ( mkdir myDirName && echo myDirName created)
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 это каталог
- бар это файл
- 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 ) ) )
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
)
0
exist myDirName/nul

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

-1

Поиск папки не должен быть таким сложным. Мое решение, используйте 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";
   }
}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .