यदि कोई निर्देशिका विंडोज में मौजूद है तो कैसे जांचें?


59

मैं इस लिनक्स / बैश स्क्रिप्ट का विंडोज शेल में अनुवाद करना चाहूंगा:

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

यह परीक्षण करता है कि क्या कोई निर्देशिका मौजूद है, और यदि यह नहीं है तो यह इसे बनाता है।


3
वास्तविक लिनक्स / बैश कमांड बस होगा mkdir -p myDirName:। दिन बिताने के बाद बैच-श * टी में अपेक्षाकृत सरल बैश-लिपियों का अनुवाद करने की कोशिश कर रहा है (किसी फ़ंक्शन के परिणाम को एक चर के रूप में निर्दिष्ट करते हुए?), मैंने बस लोगों को साइबरविन स्थापित करने का निर्णय लिया है।
माइकल

जवाबों:


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

बार्लोप द्वारा जोड़ा गया

जबकि ऊपर इस विशेष स्थिति के लिए काम करता है, शीर्षक विशेष रूप से एक निर्देशिका के लिए परीक्षण के बारे में कहता है। फॉग की टिप्पणी के if exist mydirname\बजाय प्रयोग करने का if exist mydirnameतरीका है। कुछ उत्तरों ने \ nul का उपयोग किया है, लेकिन \ nul NT में समस्याग्रस्त है। एक अनुगामी बैकस्लैश शामिल नहीं है जो एक फ़ाइल या निर्देशिका के लिए परीक्षण करेगा। इसलिए, एक निर्देशिका के लिए, पीछे आने वाले बैकलैश को शामिल करें।


23
यह फ़ाइल अस्तित्व के परीक्षण के लिए सही है, लेकिन आप कैसे जानते हैं कि यह एक निर्देशिका है? सबसे सरल उत्तर है if exist mydirname\ और बाकी जैसा आप कहेंगे। वैकल्पिक रूप से, आप वास्तव में एक testबाइनरी प्राप्त कर सकते हैं और इसे विंडोज पर उपयोग कर सकते हैं।
फॉगग

@phogg: इस विशिष्ट प्रश्न के संदर्भ में: यदि यह मौजूद है, लेकिन एक फ़ाइल है, तो भी आप mkdirइसे नहीं कर सकते ।
grawity

@ ग्रेविटी: यदि यह मौजूद है, लेकिन यह एक फाइल है तो स्क्रिप्ट संभवतः बाद में विफल हो जाएगी जब इसे एक निर्देशिका के रूप में उपयोग करने की कोशिश की जाएगी, जो संभवत: ऐसा नहीं है।
13

अगर मौजूद नहीं है तो मैं कैसे जांच कर सकता हूं?
सुंगगुक लिम

1
@sunglim द्वारा `अगर myDirName \ _ मौजूद नहीं है if not 1==1 echo hmm तो इसी तरह से या अगर myDirName \ ELSE blahblahblah मौजूद है
barlop

20

यहाँ है जो मुझे अभी पता चला है:

यदि कोई फ़ाइल मौजूद है तो आप परीक्षण कर सकते हैं; यदि निर्देशिका मौजूद है, तो इसमें एक nul फ़ाइल होगी, यदि nul फ़ाइल मौजूद नहीं है, तो निर्देशिका मौजूद नहीं है।

IF exist myDirName/nul ( echo myDirName exists ) ELSE ( mkdir myDirName && echo myDirName created)

2
+1 - यह सभी विंडोज़ और एमएस-डॉस संस्करणों में काम करता है, सादे के विपरीत if exist dirnameजो विंडोज एनटी के लिए विशिष्ट प्रतीत होता है।
grawity

यह एक बेवकूफ कोड की तुलना में लिनक्स mkdir -p myDirName: p
किट हो

6
यह बैकस्लैश होना चाहिए, फॉरवर्ड स्लैश नहीं।
नाथन गर्बेडियन 23

@grawity आपको इस बारे में क्या लगता है, हालांकि, जाहिरा तौर पर कुछ मुद्दे \ n नहीं कर रहे हैं? dostips.com/forum/viewtopic.php?f=3&t=4913
Barlop

@barlop: मुझे लगता है कि cmd.exe अस्तित्व में सबसे खराब स्क्रिप्टिंग भाषाओं में से एक है, और यदि संभव हो तो किसी को PowerShell या अन्य विकल्पों का उपयोग करना चाहिए। के रूप में \nul, यह Windows NT में अब आवश्यक नहीं है, सादे if exist "C:\Program Files (x86)"को काम करना चाहिए (जब तक कि आप अभी भी विंडोज 98 को लक्षित नहीं कर रहे हैं ...)
विशाल

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 
  ) 
)

- फू एक निर्देशिका है
- बार एक फाइल है
- xyz मौजूद नहीं है

संपादित करें: यह केवल तभी काम करता है जब निर्देशिका नाम में रिक्त स्थान न हों


5

कुछ लोगों ने सुझाव दिया है कि वे 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

मैं सोचता था कि joe में गिरावट क्यों थी क्योंकि मैं विंडोज 7 पर उसी तरह की समस्या का अनुभव कर रहा था, अर्थात्

यदि EXIST फ़ाइल नाम \ NUL है

दोनों फ़ाइलों और निर्देशिकाओं के लिए TRUE लौट रहा था। मुझे www.robvanderwoude.com/battech_ifexistfolder.php पर एक वैकल्पिक समाधान मिला और 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 ) ) )

यह एकमात्र समाधान था जिसने काम किया, धन्यवाद। मैंने त्रुटि संदेश से बचने के लिए "2> NUL" जोड़ा और गूंज मानों को 1 में बदल दिया (निर्देशिका मौजूद है), 0 (निर्देशिका मौजूद नहीं है), -1% (इसी नाम की एक फ़ाइल मौजूद है)% A IN (" C: \ temp \ foo \ HELLO WORLD5 ") DO @ (PUSHD"% A "2> NUL && (POPD & ECHO 1) || (IF EXIST% A (ECHO -1) ELSE (ECHO 0
Christoph

(क्षमा करें, मैंने उत्तर में कोड के रूप में कोड को प्रारूपित करने का प्रबंधन नहीं किया, हालांकि मैंने बहुत सी चीजों की कोशिश की :-( टिप्पणी को संपादित करने तक 5 मिनट के बाद:
क्रिस्टोफ

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
)

(1) यदि आप एक चर का उपयोग करने जा रहे हैं, तो चर का उपयोग करें। MyDirपहली पंक्ति के बाद की सभी घटनाएं होनी चाहिए %MyDir%। (2) बहु-स्तरीय पाथनाम (जैसे, ) या यहां तक ​​कि एक पूर्ण पथ-नाम (जैसे, ) होने पर cd ..आप जो चाहते हैं वह नहीं करेंगे । / और / या का उपयोग करने पर विचार करें । %MyDir%Pictures\cats\Windowspushdpopdsetlocal
स्कॉट

0
exist myDirName/nul

यह भी सच है अगर myDirName एक फाइल है, तो व्हिस सर्च की गई कार्यक्षमता नहीं है


1
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>मैं NT में \ Nul का कोई प्रशंसक नहीं हूँ, लेकिन यह नहीं है। आपको कुछ आउटपुट देना चाहिए था।
बार्लोप

-1

एक फ़ोल्डर ढूँढना यह मुश्किल नहीं होना चाहिए। मेरा समाधान, पर्ल का उपयोग करें:

के लिए ($ cnt = $ # ARGV; $ cnt> = 0; - $ cnt)
{
   अगर (-d "$ ARGV [$ cnt]") { 
      प्रिंट "argv [$ cnt] = $ ARGV [$ cnt] एक फ़ोल्डर \ n" है;
      $ dir = $ ARGV [$ cnt];
      टूटना;
   } अन्य {
      प्रिंट "argv [$ cnt] = $ ARGV [$ cnt] एक फ़ोल्डर नहीं है \ n";
   }
}

मुझे यह नहीं मिलता है
पियरे.वीरेंस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.