जैसा कि कुछ अन्य उत्तर / टिप्पणियाँ ध्यान दें, यह विचार कि कमांड सही नहीं है के बाद एक स्थान होना चाहिए। एक प्रसिद्ध उदाहरण यह है कि आप एक कमांड के बाद आगे स्लैश टाइप कर सकते हैं, पहले एक स्थान की आवश्यकता के बिना।
हालांकि, एक और व्यवहार है जो थोड़ा कम समझा जाता है, और उस " cd..
" को अनुमति देता है जिसके बारे में आप पूछ रहे हैं। यह व्यवहार cd\
काम करने के लिए भी अनुमति देता है ।
आपके द्वारा वर्णित व्यवहार कमांड लाइन दुभाषिया के लिए आंतरिक सभी आदेशों के अनुरूप है। यदि आपके पास अवधि, फ़ॉरवर्ड स्लैश या बैकस्लैश सहित कुछ प्रतीक हैं, तो पूर्व वर्णों को यह देखने के लिए चेक किया जाता है कि क्या वे एक कमांड हैं जो "कमांड लाइन इंटरप्रेटर" शेल (CMD.EXE) या इसके पूर्ववर्ती COMMAND.COM के लिए आंतरिक है )।
यह जाँचने से पहले किया जा सकता है कि क्या शब्द किसी फ़ाइल या उपनिर्देशिका का उल्लेख कर सकता है। यह cd
आदेश के लिए सही है । दुख की बात है कि एक नमूना बनाते समय, मैंने पाया कि copy
कमांड के साथ ऐसा नहीं होता है , इसलिए परिणाम असंगत हैं: वे सभी आंतरिक आदेशों के साथ जरूरी नहीं हैं। मैं अपने खोज भी तुलना करने के लिए (बहुत) अन्य आदेशों लाइन नहीं जारी रखने के लिए किया था del
और dir
, तो मैं बस बहुत सावधान किया जा रहा सुझाव है कि अगर आप क्या स्पेस के बिना होता है पर भरोसा करने की कोशिश करते हैं।
अब, इको कमांड के बारे में भी पूछा गया प्रश्न : यह एक असामान्य अपवाद है, जिसमें मुझे लगता echo.
है कि डॉस विशेषज्ञों द्वारा काफी प्रसिद्ध है। यह शायद प्रलेखित किया गया था। कम से कम Win7 के CMD में व्यवहार यह है कि यदि कमांड " echo.
" से शुरू होता है , तो पहली अवधि को अनदेखा कर दिया जाता है। तो, "" echo..hi
"के आउटपुट में बदल जाता है .hi
"। इसका कारण इतना है कि " echo.
" का उपयोग रिक्त लाइन को प्रिंट करने के लिए किया जा सकता है। इसके विपरीत, यूनिक्स के साथ, आप इसे केवल " echo
" कमांड चलाकर कर सकते हैं । हालाँकि, DOS में, " echo
" कमांड को चालू करने से वर्तमान " इको " सेटिंग का उत्पादन होगा । इसी तरह, डॉस Echo *Off*
"और" व्यवहार करता हैEcho *On*
"विशेष मूल्यों के रूप में जो वर्तमान गूंज सेटिंग को बदलते हैं। यदि आप वास्तव में शब्द को प्रिंट करना चाहते हैं Off
", तो " Echo.Off
" चाल को कम से कम (माइक्रोसॉफ्ट के सीएमडी कमांड लाइन दुभाषिया के हाल के पर्याप्त संस्करणों के साथ करता है ।)
तो, कम से कम echo
कमांड में एक अर्ध-उचित स्पष्टीकरण है। शेष आदेशों के लिए, मैं समझता था कि आंतरिक आदेशों की प्राथमिकता थी। हालांकि, जब मैंने कुछ परीक्षण करने की कोशिश की, तो मैंने पाया कि वास्तव में असंगत है। मैं इसे कुछ उदाहरणों के माध्यम से प्रदर्शित करता हूं जिन्हें मैंने यहां दस्तावेजित किया था।
यहाँ कुछ उदाहरण हैं। मैं एक उन्नत कमांड प्रॉम्प्ट का उपयोग करता था, ताकि UAC मुझे रूट निर्देशिका में लिखने के बारे में नहीं बताए। यह माइक्रोसॉफ्ट विंडोज 7 के CMD.EXE के साथ किया गया था। मुझे लगता है कि व्यवहार अन्य संस्करणों के साथ भिन्न हो सकता है, जैसे पुराने MS-DOS संस्करणों से COMMAND.COM, या अन्य कंपनियों द्वारा जारी सॉफ़्टवेयर (DR-DOS's COMMAND.COM)।
(यह उत्तर पहले से ही काफी लंबा है, इसलिए मैं अपने फाइल सिस्टम पर किए गए सभी गड़बड़ को साफ करने के लिए आदेशों को शामिल नहीं कर रहा हूं। छोटे-से साफ-सुथरा सा है, लेकिन ज्यादा नहीं।)
यहां एक उदाहरण है जो यह साबित करता है कि आंतरिक आदेश पूर्वता बनाता है। (मैं प्रभावी रूप से एक टिप्पणी करने के लिए एक डबल कोलन का उपयोग करने के लिए बल्कि अल्प-ज्ञात क्षमता का प्रदर्शन करता हूं, जो बैच फ़ाइलों में भी अच्छी तरह से काम करता है। तकनीकी रूप से, बैच फ़ाइलों में, इसे एक लेबल के रूप में संसाधित किया जाता है, जिसे GOTO द्वारा नहीं पहुँचा जा सकता है, और समाप्त होता है। REM कमांड से तेज)
C: \ something> md cd
C: \ something> echo echo subdir >> cd \ a.bat
C: \ something> md \ a
c: \ something> । \ Cd \ a.bat
subdir
C: \ something> :: वह उप-सदृश
C: \ something> cd \ a
C: \ a> से चला गया :: :: जिसने मेरी वर्तमान निर्देशिका को बदल दिया, इसलिए cd ने पूर्वता लिया
अद्यतन: आगे के प्रयोग पर, मैंने पाया कि आंतरिक सीडी कमांड केवल फाइल सिस्टम पर पूर्ववर्तीता लेता है यदि निर्दिष्ट निर्देशिका में एक अवधि शामिल नहीं है। इसलिए यदि आपके पास " a.bat " नाम की निर्देशिका है , तो आप " **cd\a.bat**
" चला सकते हैं और बैच फ़ाइल चलेगी।
कम सामान्य व्यवहार की खोज (क्योंकि अधिकांश निर्देशिकाओं में संभवतः उनमें अवधि नहीं है) ने मुझे अपने निष्कर्षों को अपडेट करने के लिए प्रेरित किया। यह पता चला है कि सीडी कमांड वास्तव में कॉपी कमांड के समान व्यवहार कर रहा है, जैसा कि मैंने शुरू में सोचा था।
हालांकि मैंने शुरू में सोचा था कि सीडी और कॉपी कमांड अलग-अलग व्यवहार कर रहे थे, मुझे अब पता चला कि नामों के पैटर्न के कारण मैं प्रदान कर रहा था। फिर भी, मैंने अपने पहले के परिणामों की समीक्षा की, और यह निर्धारित किया कि मेरे पहले के दस्तावेज परीक्षण कुछ अंतर दिखाने में मदद करते हैं कि क्या होता है जब एक नाम में एक अवधि और एक एक्सटेंशन शामिल होता है, और जब यह नहीं होता है। इसलिए, मैं अभी भी अपने पुराने निष्कर्षों को शामिल कर रहा हूं (ज्यादातर अपरिवर्तित, लेकिन कुछ बहुत ही मामूली अपडेट के साथ इसलिए जो मैं कहता हूं वह सटीक है)।
एक उदाहरण दिखा रहा है प्रतिलिपि , एक पूर्ण पथ के साथ, एक ही पूर्वता का उपयोग नहीं करता है (आंतरिक कमांड के पक्ष में) सीडी के रूप में जब कोई एक्सटेंशन का उपयोग नहीं किया जाता है:
C: \ something> इको इको रूट >> \ try.bat
C: \ something> md copy
C: \ something> इको इको उपनिर्देशिका >> कॉपी \ try.bat
C: \ something> । \ Copy \ try.bat रन। उपनिर्देशिका
उपनिर्देशिका
C: \ something> copy \ try.bat
उपनिर्देशिका
C: \ something> :: हुह? वह ओवरराइड और रूट से क्यों नहीं चला?
C: \ something> :: जाहिर है, आंतरिक कॉपी कमांड में उपनिर्देशिका और पूर्ण फ़ाइल नाम के लिए चेक पर प्राथमिकता नहीं थी (भले ही आंतरिक सीडी कमांड ने प्राथमिकता दी हो, जब निर्देशिका का कोई विस्तार नहीं था)
C: \ something> ::
C: \ something>:: एक अन्य परीक्षण: मैं अंत में बेकार
सी जोड़ सकता हूं: सी कुछ \ _ > । कॉपी .. \ try.bat
उपनिर्देशिका
C: \ something> :: ठीक है, महान। लेकिन फिर यह उपनिर्देशिका की जाँच नहीं करेगा:
C: \ something> copy .. \ try.bat
1 फ़ाइल (ओं) की प्रतिलिपि बनाई गई।
C: \ something> :: कि आंतरिक प्रतिलिपि आदेश चला
मेरे शुरुआती निष्कर्षों ने संकेत दिया कि ये परिणाम दर्शाते हैं कि कमांड लाइन शेल प्राथमिकता देता है:
- फाइलसिस्टम (आंतरिक कॉपी कमांड के बजाय ) जब आंतरिक कमांड के नाम के ठीक बाद बैकस्लैश निर्दिष्ट करता है
- आंतरिक कमांड के नाम के ठीक बाद बैकस्लैश निर्दिष्ट करते समय आंतरिक सीडी कमांड (फाइलसिस्टम के बजाय)।
- आंतरिक कमांड के नाम के ठीक बाद की अवधि निर्दिष्ट करते समय आंतरिक कॉपी कमांड (फाइलसिस्टम के बजाय)।
यह स्पष्ट रूप से दर्शाता है कि व्यवहार कॉपी कमांड (एक एक्सटेंशन सहित पूर्ण फ़ाइल नाम के साथ) और सीडी कमांड (निर्देशिका नाम के भाग के रूप में विस्तार के बिना ) के बीच सुसंगत नहीं है । बैकस्लैश का उपयोग करते समय, कॉपी कमांड (पूर्ण फ़ाइल नाम एक्सटेंशन के साथ) पहले फाइलसिस्टम की जांच करेगा, लेकिन सीडी कमांड नहीं होगा (यदि निर्देशिका में एक्सटेंशन नहीं है)।
(अपडेट: सबसे पहले, मुझे लगा कि विसंगति कार्यक्रमों के बीच अलग-अलग व्यवहार पर आधारित है। बाद में, मुझे पता चला कि विसंगति मौजूद थी, लेकिन प्रदान किए गए मापदंडों से अधिक थी।)
वास्तव में, यहां तक कि उन बुलेट बिंदु भी पूरी तरह से सही नहीं हैं, भले ही मैंने सिर्फ मेरे द्वारा कहे गए प्रत्येक व्यक्ति को प्रदर्शित करने के लिए ऐसा किया था। समस्या यह है कि, बुलेट बिंदुओं की सूची पूरी तरह से सटीक होने के लिए पर्याप्त नहीं है। (मैंने चीजें छोड़ीं, ताकि उन बुलेट बिंदुओं की तुलना अपेक्षाकृत आसानी से की जा सके, और अपेक्षाकृत आसानी से जांचे जा सकें।)
हालाँकि, अधिक सटीक होने के लिए, पहली गोली बिंदु को इंगित करना चाहिए कि कमांड लाइन शेल प्राथमिकता देता है:
- एक बैकस्लैश को निर्दिष्ट करते समय फाइलसिस्टम (आंतरिक कॉपी कमांड के बजाय ) और आंतरिक कमांड के नाम के ठीक बाद पूर्ण पथ का शेष भाग
निम्नलिखित प्रदर्शित करेगा कि मैं वह भेद क्यों कर रहा हूँ:
C: \ el
कहीं और> इस लाइन के लिए echo UAC एलिवेशन की जरूरत है >> \ needext
C: \ el कहीं और> इस लाइन के लिए echo UAC एलिवेशन की जरूरत है >> \ needext.bat
C: \ el कहीं और> md। \ Copy C: / el
अन्य जगह> echo @ Echo subdir >> copy \ needext.bat
C: \ el
others > । \ Copy \ needext subdir
C: \ el
others > copy \ needext.bat subdir
C: \ el others > copy \ needext
1 फ़ाइल (ओं) की प्रतिलिपि बनाई गई।
C: \ el कहीं> :: UAC को अगली पंक्तियों के लिए भी आवश्यकता होती है
C: \ el others > del \ needext
C: \ el others > del \ needext.bat
(ध्यान दें कि अंतिम कॉपी कमांड फ़ाइल की तलाश में था जिसे \ needext कहा जाता था , क्योंकि आंतरिक कॉपी कमांड का उपयोग किया गया था। फ़ाइल \ needext.bat केवल आसानी से यह दिखाने में मदद करने के लिए बनाई गई थी कि यह कभी भी कमांड लाइनों द्वारा उपयोग नहीं किया गया था जिसमें शब्द कॉपी शामिल थी। ।)
इस बिंदु पर, मैंने एक बैकस्लैश का उपयोग करने पर कुछ असंगतता ( कॉपी कमांड के व्यवहार के साथ) स्थापित की ...
आगे मैं यह प्रदर्शित करूँगा कि इन आज्ञाओं के बीच कुछ सामंजस्य है। (तो, वहाँ स्थिरता है ... उम ... कभी-कभी। हमारे पास केवल असंगतता हो सकती है, असंगत रूप से।) जो मैं आगे दिखाऊंगा वह यह है कि सीडी कमांड कॉपी कमांड की तरह व्यवहार करता है जब एक अवधि का उपयोग किया जाता है। प्रतिलिपि आदेश आंतरिक आदेश का उपयोग करता है, और ऐसा नहीं करता है सीडी आदेश।
C: \ कुछ> md \ yetmore।
C: \ कुछ> सीडी \ yetmore।
C: \ कुछ \ yetmore> md \ md।
C: \ कुछ \ yetmore> गूंज गूंज subdir >> md \ test.bat
C: \ कुछ \ yetmore> । \ md। \ test
subdir
C: \ something \ yetmore> md। \ test
C: \ something \ yetmore> md। \ परीक्षण।
एक उपनिर्देशिका या फ़ाइल। \ परीक्षण पहले से ही मौजूद है।
C: \ something \ yetmore> :: यह त्रुटि दिखाती है कि हमने आंतरिक कमांड चलाया है।
C: \ something \ yetmore> md .. \ test
C: \ something \ yetmore> md। \ Cd ।
C: \ something \ yetmore> प्रतिलिपि। \ Md cd
। \ Md \ test.bat
1 फ़ाइल (s) की प्रतिलिपि बनाई गई है।
C: \ something \ yetmore> । \ Cd । \ Test
subdir
C: \ something \ yetmore> cd। \ Test
C: \ something \ yetmore \ test> :: आंतरिक कमांड ने एक अवधि के
साथ काम किया C: \ something \ yetmore \ परीक्षण> cd ..
C: \ something \ yetmore> । \ cd .. \ test
subdir
C: \ something \ yetmore> cd .. \ test
C: \ something \ test> :: आंतरिक आदेश ने भी प्राथमिकता दी जब दो अवधियाँ हैं उपयोग किया गया
इसलिए, प्रारंभिक परीक्षण सत्र के दौरान, जो अधिकतर सीडी और कॉपी कमांड पर केंद्रित होता था (कुछ अतिरिक्त उपयोग के साथ md और बिट ऑफ डेल ), एकमात्र समय जब हमारे पास वास्तव में फाइलसिस्टम को प्राथमिकता थी, प्रतिलिपि कमांड के साथ थी , और फिर पूर्ण पथ का उपयोग करते समय फ़ाइल सिस्टम केवल प्राथमिकता ले रहा था।
बाद की समीक्षा के बाद, मैंने पाया कि सीडी कमांड ने एक्सटेंशन का उपयोग करते समय फाइल सिस्टम को भी प्राथमिकता दी है। कम से कम इसका मतलब है कि आंतरिक आदेशों को एक दूसरे के साथ थोड़ा अधिक सुसंगत माना जा रहा है। हालाँकि, इसका यह भी अर्थ है कि हमें फाइल सिस्टम ऑब्जेक्ट्स (फाइलों या निर्देशिकाओं) के नाम के आधार पर अलग-अलग व्यवहार मिलता है। ऐसा लगता है कि व्यवहार कुछ वास्तव में, वास्तव में अस्पष्ट आंतरिक तर्क का उपयोग कर रहा है। इसलिए, अलग-अलग ऑपरेटिंग सिस्टम पर काम करने के लिए इस व्यवहार की गिनती कुछ ऐसा है जिसे मैं शायद करने के लिए असुरक्षित समझूंगा ।