Створіть папку з пакетною, але лише якщо вона ще не існує


440

Хтось може сказати мені, як зробити наступне в пакетному сценарії Windows? ( *.bat):

  • Створіть папку, лише якщо вона ще не існує

Більш детально, я хочу створити папку, названу VTSна C:\диску, але лише якщо ця папка ще не існує. Я не хочу перезаписувати вміст папки, якщо він уже існує і пакет виконаний.


2
Як щодо цього? if not exist "%Folder%" mkdir "%New-Folder%"
scientist_7

Відповіді:


622

Ви просто використовуєте це: if not exist "C:\VTS\" mkdir C:\VTSвін створить каталог, лише якщо папка не існує.

Зауважте, що цей тест існування повернеться істинним, лише якщо існує VTS та є каталогом. Якщо його немає, або він є файлом, команда mkdir запуститься і повинна спричинити помилку. Ви можете перевірити, чи існує також VTS як файл.


7
За винятком того, що це неправильно. Ви повинні перевірити наявність пристрою NUL, інакше він не працюватиме. Дивіться мою відповідь на три роки раніше, ніж ця.
Мартін Шапендонк

@MartinSchapendonk Це працює на Windows 7 та Windows Server 2012, наскільки я можу сказати з тестування, і я буду дуже здивований, якщо він не працює принаймні до XP та до Windows 10. Чи можете ви надати умови, коли це не працює?
jpmc26

12
@ jpmc26 тестування для NUL - це переконатися, що ви протестуєте каталог. Інакше умова може бути достовірною, навіть якщо це звичайний файл. У цьому різниця.
Мартін Шапендонк

3
@MartinSchapendonk Чи достатньо для цього додавання косої косої риси? Це, здається, правильно розрізняє файли та каталоги, але є слабкість у тому, що якщо файл не буде виявлено, створення каталогу не вдасться. Я підозрюю, що це теж проблема з тестуванням NUL.
jpmc26

6
@ jpmc26 Ви маєте рацію, кінець косої риси виконує цю роботу і є фактично кращим, оскільки він працює з цитатами (таким чином, ви можете мати пробіли в шляху до каталогу). Для того, щоб розрізняти або файл / каталог, це буде працювати: if exist "a" if not exist "a\" (echo "it's a file") else (echo "it's a dir"). Щодо вашого останнього речення, я підозрюю, що з вашим пакетним файлом в іншому місці щось не так.
Марк.2377

221
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

(Оновлення 7 березня 2018 року; стаття Microsoft вимкнена, архівуйте на https://web.archive.org/web/20150609092521/https://support.microsoft.com/en-us/kb/65994 )


12
Особисто я вважаю за краще це, оскільки він не встановлює% errorlevel%, коли dir вже існує (відповідь Agent_9191 повертає код помилки 1)
csauve

1
Це також приємно і загально, і його можна застосувати до будь-яких інших дій, які ви хочете умовно зробити :)
Джон Хамфріс - w00te

3
@YouHaveaBigEgo NULз одним Л.
Мартін Шапендонк

1
Посилання більше не працює, але є копія в Інтернет-архіві
fernio

3
Насправді, хоча ця відповідь чудова, вона не відповідає на запитання "створити каталог" :)
Жан-Франсуа Т.

55

Просто зателефонуйте, mkdir C:\VTSнезважаючи ні на що. Він просто повідомить, що підкаталог вже існує.

Редагувати: Як зазначали інші, це встановлює% ERRORLEVEL%, якщо папка вже існує. Якщо ваша група (або будь-які процеси, що викликають її) не хвилює рівень помилок, цей метод працює добре. Оскільки в запитанні не було зазначено, щоб уникнути рівня помилок, ця відповідь є абсолютно вірною. Він відповідає потребам створення папки, якщо її немає, і вона не перезаписує вміст існуючої папки. В іншому випадку дотримуйтесь відповіді Мартіна Шапендонка .


20
це погана поведінка через несподіване повідомлення про помилку / попередження.
SeriousM

11
Називати щось «цілком дійсне», коли воно порушує кращі практики, - це нечесно інтелектуально. Як інший приклад: Коли хтось запитує вас, як уникнути певної конкретної проблеми безпеки, у вашій відповіді не повинно бути «запустити комп’ютер як адміністратор», навіть якщо в цьому питанні явно не було вказано мінімальний вплив на безпеку як обов’язкова умова. :-)
Jouni Heikniemi

2
@JouniHeikniemi s / кращі практики / особисті вподобання Jouni
dss539

4
Нічого поганого з Errorlevel або errno. Вони є характерними для платформи парадигмами повідомлень про помилки, і вони працюють для тієї мети, для якої вони були побудовані. Але незалежно від того, якою є платформа чи підхід до обміну повідомленнями, я б не рекомендував схему "намагатися зробити це та відновити, якщо це не вдасться", коли можна легко уникнути поширеного випадку помилок - і, таким чином, розбірливо документувати. Отже, я вважаю, що стиль "якщо не існує" вище, ніж підхід. Але я не хочу і не хочу надто глибоко заглиблюватися в дебати про формування найкращих практик. Я не мав наміру когось ображати, просто хотів роз'яснити свою заяву.
Jouni Heikniemi

4
Проблема просто ігнорувати помилку полягає в тому, що ви не знаєте, чому вона вийшла з ладу. Можливо, це не вдалось, тому що каталог вже існував, тому що у користувача немає дозволів на цей каталог, тому що батьківський шлях не існував або через те, що диск вийшов з ладу. "Створити, якщо його не існує", має бути невдалим у всіх випадках, крім першого. Однак ця відповідь призводить до помилки у всіх випадках. Ось чому це не підходить для пакетного сценарію. -1
jpmc26

38
mkdir C:\VTS 2> NUL

створити папку, яку називають VTSта виводить A subdirectory or file TEST already existsу NUL.

або

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

змінити букву диска C:, mkdir, вихідний помилку в NULі запустити наступну команду.


Чи є спосіб зробити цю роботу в PowerShell? Схоже, він не підтримує NULяк вихідний файл.
Аарон Франке

30
set myDIR=LOG
IF not exist %myDIR% (mkdir %myDIR%)

1
Як зазначали інші, і ви, можливо, бачили відповідь з найвищим рейтингом, це не спрацює, якщо у вас є файл з іменем log. Це незначна різниця, але це призведе до важко знайти помилок у ваших сценаріях.
Авель

20

Я використовую цей спосіб, ви повинні поставити зворотній косою рисою в кінці імені каталогу, щоб уникнути того, що місце існує у файлі без розширення з тим самим іменем, що і вказаний вами каталог, ніколи не використовуйте "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

3
Особливо цікавим для вашого рішення є те, що ви використовуєте !errorlevel!, тобто, затримку розширення. В іншому випадку змінна ERRORLEVELбуде проаналізована до введення першої if(тобто, під час розбору). Тепер він розбирається під час виконання, щоб він міг зафіксувати результат mkdir. Ви також в цьому правильні, навіть якщо ви перевіряєте наявність, все-таки слід перевірити на успіх (подумайте: наприклад, у доступі відхилена помилка). Дуже хороше рішення порівняно з іншими, +10 !!!
Авель

17

Ви можете використовувати:

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

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

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

0

Я створив це для мого сценарію, який використовую у своїй роботі для окулярів.

: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\"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.