Ответы:
@echo off
IF exist myDirName ( echo myDirName exists ) ELSE ( mkdir myDirName && echo myDirName created)
Добавлено Barlop
Хотя вышесказанное работает для данной конкретной ситуации, в заголовке говорится о тестировании специально для каталога. Комментарий Фогга, if exist mydirname\
а не if exist mydirname
способ. Некоторые ответы использовали \ nul, но \ nul проблематичен в NT. Не включая завершающую обратную косую черту будет проверять файл или каталог. Так, для каталога, включите обратную косую черту.
if exist mydirname\
а остальное как вы говорите. С другой стороны, вы можете получить test
двоичный файл и использовать его в Windows.
mkdir
это сделать.
if not 1==1 echo hmm
или если существует myDirName \ ELSE blahblahblah
Вот что я только что узнал:
Вы можете проверить, существует ли файл nul; если каталог существует, он будет содержать nul-файл, если nul-файл не существует, то каталог не существует.
IF exist myDirName/nul ( echo myDirName exists ) ELSE ( mkdir myDirName && echo myDirName created)
if exist dirname
которая, кажется, специфична для Windows NT.
\nul
, что в Windows NT больше нет необходимости, обычный if exist "C:\Program Files (x86)"
должен работать (если вы все еще не нацелены на Windows 98 ...)
Используйте обратную косую черту, а не прямую косую черту: 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 не существует
редактировать: это работает, только если имя каталога не содержит пробелов
Некоторые предлагали сделать \ 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>
Я задавался вопросом, почему у Джо было отрицательное мнение, поскольку у меня была такая же проблема в 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 ) ) )
Я вижу, что у многих есть проблемы с различием между файлами и папками. Кто-нибудь пробовал просто войти в него после проверки его существования? Тогда 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
)
MyDir
после первой строки должны быть %MyDir%
. (2) Не cd ..
будет делать то, что вы хотите, если %MyDir%
это многоуровневое имя пути (например, Pictures\cats
) или даже абсолютный путь (например, \Windows
). Подумайте об использовании pushd
/ popd
и / или setlocal
.
exist myDirName/nul
также верно, если myDirName - это файл, то есть не найденная функциональность
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, но это не так. Вы должны были дать какой-то вывод.
Поиск папки не должен быть таким сложным. Мое решение, используйте 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"; } }
mkdir -p myDirName
. Потратив дни на попытки перевести относительно простые bash-скрипты в batch-sh * t (присвоение результата функции переменной?), Я решил просто заставить людей установить cygwin.