बैच के साथ फ़ोल्डर बनाएँ, लेकिन केवल अगर यह पहले से मौजूद नहीं है


440

क्या कोई मुझे बता सकता है कि विंडोज बैच स्क्रिप्ट में निम्नलिखित कैसे करें? ( *.bat):

  • एक फ़ोल्डर तभी बनाएं जब वह पहले से मौजूद न हो

अधिक विस्तार से, मैं ड्राइव VTSपर नामित फ़ोल्डर बनाना चाहता हूं C:\, लेकिन केवल अगर वह फ़ोल्डर पहले से मौजूद नहीं है। मैं फ़ोल्डर की सामग्री को अधिलेखित नहीं करना चाहता अगर यह पहले से मौजूद है और बैच निष्पादित है।


2
इस बारे में कैसा है ? if not exist "%Folder%" mkdir "%New-Folder%"
वैज्ञानिक_7

जवाबों:


622

आप बस इसका उपयोग करते हैं: if not exist "C:\VTS\" mkdir C:\VTSयह केवल एक निर्देशिका बना देगा यदि फ़ोल्डर मौजूद नहीं है।

ध्यान दें कि यह अस्तित्व परीक्षण केवल तभी वापस आएगा यदि VTS मौजूद है और एक निर्देशिका है। यदि यह वहां नहीं है, या एक फाइल के रूप में है, तो mkdir कमांड चलेगी, और एक त्रुटि का कारण होना चाहिए। आप जाँच कर सकते हैं कि क्या वीटीएस एक फाइल के रूप में मौजूद है।


7
सिवाय इसके कि यह गलत है। आपको NUL डिवाइस के लिए जांचना होगा, अन्यथा यह काम नहीं करेगा। इस एक से तीन साल पहले मेरा जवाब देखें।
21:39 पर मार्टिन शेपेंडकोंड

@MartinSchapendonk यह विंडोज 7 और विंडोज सर्वर 2012 पर काम करता है जहां तक ​​मैं परीक्षण से बता सकता हूं, और मुझे बहुत आश्चर्य होगा अगर यह कम से कम XP और विंडोज 10 तक काम नहीं करता है। क्या आप शर्तों को प्रदान कर सकते हैं जब यह काम नहीं करता है?
jpmc26

12
NUL के लिए @ jpmc26 परीक्षण यह सुनिश्चित करने के लिए है कि आप किसी निर्देशिका के लिए परीक्षण करें। अन्यथा स्थिति सत्य का मूल्यांकन कर सकती है, यहां तक ​​कि यह एक नियमित फ़ाइल है। यही अंतर है।
मार्टिन शेपेंडकोंड

3
@MartinSchapendonk क्या एक अनुगामी स्लैश जोड़ना उसके लिए पर्याप्त है? यह सही ढंग से फ़ाइलों और निर्देशिकाओं के बीच अंतर करने के लिए लगता है, लेकिन इसमें एक कमजोरी यह है कि यदि फ़ाइल का पता नहीं लगाया जाता है, तो निर्देशिका का निर्माण विफल हो जाएगा। मुझे संदेह है कि यह परीक्षण के लिए NULभी एक समस्या है।
jpmc26

6
@ jpmc26 आप सही हैं, एक अनुगामी स्लेश काम करता है और वास्तव में बेहतर है क्योंकि यह उद्धरण के साथ काम करता है (इस प्रकार आपको निर्देशिका पथ में स्थान बनाने की अनुमति देता है)। फ़ाइल / निर्देशिका के बीच अंतर करने के लिए, यह काम करेगा if exist "a" if not exist "a\" (echo "it's a file") else (echo "it's a dir"):। आपके अंतिम वाक्य के बारे में, मुझे संदेह है कि आपकी बैच फ़ाइल कहीं और गलत है।
मरकुस २.३ at

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% सेट नहीं होता है (Agent_9191 का उत्तर 1 का त्रुटि कोड देता है)
csauve

1
यह भी अच्छा और सामान्य है और हर दूसरी क्रिया पर लागू किया जा सकता है जिसे आप सशर्त रूप से करना चाहते हैं :)
जॉन हम्फ्रेस - w00te

3
@ YouHaveaBigEgo NULएक एल के साथ है
मार्टिन शेपेंडोन्क

1
लिंक अब काम नहीं करता है, लेकिन इंटरनेट आर्काइव में एक प्रति है
fernio

3
वास्तव में, हालांकि यह उत्तर बहुत अच्छा है, यह "एक निर्देशिका बनाने के लिए" सवाल का जवाब नहीं देता है :)
जीन-फ्रेंकोइस टी।

55

बस mkdir C:\VTSकोई बात नहीं बुलाओ । यह केवल रिपोर्ट करेगा कि उपनिर्देशिका पहले से मौजूद है।

संपादित करें: जैसा कि अन्य ने नोट किया है, यह% ERRORLEVEL% सेट करता है यदि फ़ोल्डर पहले से मौजूद है। यदि आपका बैच (या इसे कॉल करने वाली कोई भी प्रक्रिया) त्रुटि स्तर की परवाह नहीं करता है, तो यह विधि अच्छी तरह से काम करती है। चूंकि प्रश्न में त्रुटि स्तर से बचने का कोई उल्लेख नहीं किया गया है, इसलिए यह उत्तर पूरी तरह से मान्य है। यदि यह मौजूद नहीं है, तो यह फ़ोल्डर बनाने की जरूरतों को पूरा करता है, और यह किसी मौजूदा फ़ोल्डर की सामग्री को अधिलेखित नहीं करता है। अन्यथा मार्टिन शेपेंडकोंड के उत्तर का पालन ​​करें ।


20
अप्रत्याशित त्रुटि संदेश / चेतावनी के कारण यह एक बुरा व्यवहार है।
SeriousM

10
किसी चीज को "पूरी तरह से वैध" कहकर पुकारना जब वह सर्वोत्तम प्रथाओं का उल्लंघन करता है तो बौद्धिक रूप से बेईमानी है। एक अन्य उदाहरण के रूप में: जब कोई आपसे पूछता है कि एक निश्चित विशिष्ट सुरक्षा समस्या से कैसे बचा जाए, तो आपका जवाब "कंप्यूटर को व्यवस्थापक के रूप में चलाना" नहीं होना चाहिए, भले ही प्रश्न स्पष्ट रूप से एक पूर्वापेक्षा के रूप में न्यूनतम सुरक्षा प्रभाव को निर्दिष्ट नहीं करता हो। :-)
जौनी हकीमनी

2
@JouniHeikniemi s / सर्वोत्तम प्रथाओं /
जौनी

4
त्रुटिपूर्ण या गलत के साथ कुछ भी गलत नहीं है। वे मंच-विशिष्ट त्रुटि संदेश प्रतिमान हैं, और वे जिस उद्देश्य के लिए बनाए गए हैं, उसके लिए वे काम करते हैं। कोई फर्क नहीं पड़ता कि प्लेटफ़ॉर्म या मैसेजिंग दृष्टिकोण क्या है, मैं "यह करने की कोशिश करने और पुनर्प्राप्त करने की कोशिश करता हूं तो यह विफल हो जाता है" की सिफारिश नहीं करेगा जब आप आसानी से बच सकते हैं - और इस प्रकार कानूनी रूप से दस्तावेज़ - सामान्य त्रुटि का मामला। इसलिए, मुझे लगता है कि "मौजूद नहीं है" -स्टाइल बेहतर है। लेकिन, मैं सर्वोत्तम प्रथाओं के गठन के बारे में बहस में बहुत गहराई तक नहीं जाना चाहता हूं। मेरा किसी को ठेस पहुंचाने का कोई इरादा नहीं था, मैं सिर्फ अपना अपमान स्पष्ट करना चाहता था।
जौनी हकीमनेई

4
बस त्रुटि को नजरअंदाज करने के साथ समस्या यह है कि आप नहीं जानते कि यह विफल क्यों हुआ। यह विफल हो सकता था क्योंकि निर्देशिका पहले से मौजूद थी, क्योंकि उपयोगकर्ता के पास उस निर्देशिका पर अनुमति नहीं है, क्योंकि मूल पथ मौजूद नहीं था, या क्योंकि डिस्क विफल हो गई थी। "बनाएँ अगर यह मौजूद नहीं है" पहले को छोड़कर सभी मामलों में विफल होना चाहिए। यह उत्तर सभी मामलों में एक त्रुटि का परिणाम है, हालांकि। इसलिए यह एक बैच स्क्रिप्ट के लिए अनुपयुक्त है। -1
jpmc26 19

38
mkdir C:\VTS 2> NUL

नामक एक फ़ोल्डर बनाएँ VTSऔर आउटपुट A subdirectory or file TEST already existsकरें NUL

या

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

अगले कमांड को ड्राइव लेटर टू C:, टू , mkdirआउटपुट एरर बदलें NULऔर रन करें।


क्या पॉवरशेल में यह काम करने का कोई तरीका है? यह NULएक आउटपुट फ़ाइल के रूप में समर्थन नहीं करता है ।
एरोन फ्रेंके

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

1
जैसा कि दूसरों ने बताया है और आपने शीर्ष रेटेड उत्तर में देखा होगा, अगर आपके पास कोई फ़ाइल है तो यह काम नहीं करता है log। यह एक सूक्ष्म अंतर है, लेकिन यह आपकी लिपियों में मुश्किल से मुश्किल कीड़े को जन्म देगा।
हाबिल

20

मैं इस तरह का उपयोग करता हूं, आपको उस स्थान से बचने के लिए निर्देशिका नाम के अंत में एक बैकस्लैश रखना चाहिए, जो आपके द्वारा निर्दिष्ट निर्देशिका के समान नाम के बिना किसी फ़ाइल में मौजूद है, कभी भी "C: \ 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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.