Создать папку с пакетом, но только если она еще не существует

266

Может ли кто-нибудь сказать мне, как сделать следующее в пакете Windows script? (*.bat):

  • Создайте папку только в том случае, если она еще не существует.

Более подробно я хочу создать папку с именем VTS на диске C:\, но только если эта папка еще не существует. Я не хочу перезаписывать содержимое папки, если она уже существует, и пакет выполняется.

Теги:
batch-file
cmd

9 ответов

387

Вы просто используете это: if not exist "C:\VTS\" mkdir C:\VTS он создаст каталог только в том случае, если папка не существует.

Обратите внимание, что этот тест существования вернет true, только если существует VTS и является каталогом. Если он отсутствует или находится в файле, команда mkdir будет запущена и должна вызывать ошибку. Возможно, вы захотите проверить, существует ли VTS как файл.

  • 6
    За исключением того, что это неправильно. Вы должны проверить устройство NUL, иначе оно не будет работать. Смотрите мой ответ на три года раньше, чем этот.
  • 0
    @MartinSchapendonk Насколько я могу судить по результатам тестирования, это работает в Windows 7 и Windows Server 2012, и я был бы очень удивлен, если бы он не работал по крайней мере до XP и до Windows 10. Можете ли вы предоставить условия, когда это не работает?
Показать ещё 3 комментария
160
if exist C:\VTS\NUL echo "Folder already exists"

if not exist C:\VTS\NUL echo "Folder does not exist"

См. также https://support.microsoft.com/en-us/kb/65994

  • 12
    Лично я предпочел бы это, так как он не устанавливает% errorlevel%, когда dir уже существует (ответ Agent_9191 возвращает код ошибки 1)
  • 1
    Это также хорошо и универсально и может быть применено к любому другому действию, которое вы хотите сделать условно :)
Показать ещё 6 комментариев
44

Просто позвоните mkdir C:\VTS независимо от того, что. Он просто сообщит, что подкаталог уже существует.

Изменить: Как отмечали другие, это устанавливает% ERRORLEVEL%, если папка уже существует. Если ваша партия (или любые процессы, вызывающие ее) не заботятся об уровне ошибки, этот метод работает хорошо. Поскольку в этом вопросе не упоминалось об избежании уровня ошибки, этот ответ совершенно справедлив. Он удовлетворяет потребности в создании папки, если она не существует, и она не перезаписывает содержимое существующей папки. В противном случае выполните ответ Мартина Шапендонка.

  • 15
    это плохое поведение из-за неожиданного сообщения об ошибке / предупреждения.
  • 7
    Называть что-то «совершенно обоснованным», когда оно нарушает лучшие практики, интеллектуально нечестно. Другой пример: когда кто-то спрашивает вас, как избежать определенной проблемы безопасности, ваш ответ не должен быть «запускать компьютер от имени администратора», даже если в этом вопросе явно не указано минимальное влияние на безопасность в качестве предварительного условия. :-)
Показать ещё 5 комментариев
28
set myDIR=LOG
IF not exist %myDIR% (mkdir %myDIR%)
  • 0
    Как отмечали другие, и вы, возможно, видели в ответе с самым высоким рейтингом, это не работает, если у вас есть файл с именем log . Это небольшая разница, но она приведет к трудным для поиска ошибкам в ваших скриптах.
24
mkdir C:\VTS 2> NUL

создайте папку с именем VTS и выведите A subdirectory or file TEST already exists в NUL.

или

(C:&(mkdir "C:\VTS" 2> NUL))&

измените букву диска на C:, mkdir, выведите ошибку до NUL и запустите следующую команду.

  • 1
    хороший и чистый, один вкладыш
10

Я использую этот способ, вы должны поместить обратную косую черту в конце имени каталога, чтобы избежать того, что это место существует в файле без расширения с тем же именем, что и указанный вами каталог, никогда не используйте "C:\VTS" , поскольку файл существует с именем "VTS" , сохраненным в разделе "C:" , правильный путь для использования "C:\VTS \" , проверьте обратную косую черту после VTS, так что это правильный путь.

@echo off
@break off
@title Create folder with batch but only if it doesn't already exist - D3F4ULT
@color 0a
@cls

setlocal EnableDelayedExpansion

if not exist "C:\VTS\" (
  mkdir "C:\VTS\"
  if "!errorlevel!" EQU "0" (
    echo Folder created successfully
  ) else (
    echo Error while creating folder
  )
) else (
  echo Folder already exists
)

pause
exit
  • 1
    Что особенно интересно в вашем решении, так это то, что вы используете !errorlevel! отложенное расширение. В противном случае переменная ERRORLEVEL будет проанализирована до ввода первого if (т. Е. Во время разбора). Теперь он анализируется во время выполнения, поэтому он может захватить результат mkdir . Вы также правы в этом, даже если вы проверяете на существование, вы все равно должны проверять на успех (например, подумайте: ошибка доступа запрещена). Очень хорошее решение по сравнению с другими, +10 !!!
9

Вы можете использовать:

if not exist "C:\VTS\" mkdir "C:\VTS"

Вы также можете развернуть код, чтобы заменить отсутствующие ожидаемые файлы.

if not exist "C:\VTS\important.file" echo. > "C:\VTS\important.file"
0

я создал это для моего script, который я использую в своей работе для eyebeam.

:CREATES A CHECK VARIABLE

set lookup=0

:CHECKS IF THE FOLDER ALREADY EXIST"

IF EXIST "%UserProfile%\AppData\Local\CounterPath\RegNow Enhanced\default_user\" (set lookup=1)

:IF CHECK is still 0 which means does not exist. It creates the folder

IF %lookup%==0 START "" mkdir "%UserProfile%\AppData\Local\CounterPath\RegNow Enhanced\default_user\"
-6

Попробуйте это

ROBOCOPY C:\Users\ADMIN\Pictures c:%date:~4,2%%date:~7,2%%date:~10,4% /MOV

Эта партия создаст новую папку и установит ее имя как текущую дату. (03222013) Затем он перемещает любые файлы в папке C:\Users\ADMIN\Pictures в эту вновь созданную папку.

Если сегодня 22 марта 2013 года.... Все файлы в C:\Users\ADMIN\Pictures будут перемещены в папку с именем 03222013.

Будут перемещены только файлы в C:\Users\ADMIN\Pictures. Любая папка в C:\Users\ADMIN\Pictures не будет затронута.

  • 6
    Как это отвечает на вопрос?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню