2012-05-09 42 views
12

बस जब मैंने सोचा कि मैंने इसे विंडोज़ पथ के मुद्दों के साथ देखा होगा, तो अब मुझे एक ऐसा मामला सामने आया है जब केवल '/' (फॉरवर्ड-स्लैश) का उपयोग पथ विभाजक के रूप में किया जाता है:Windows पर cmd.exe खोल क्यों फॉरवर्ड-स्लैश ('/' ') पथ विभाजक का उपयोग कर पथों के साथ विफल रहता है?

C:\temp\tcbugs>mkdir "dir1 with spaces" 

C:\temp\tcbugs>echo hi > "dir1 with spaces"\foo.txt 

C:\temp\tcbugs>type "dir1 with spaces\foo.txt" 
hi 

C:\temp\tcbugs>type "dir1 with spaces/foo.txt" 
The system cannot find the file specified. 

क्या इस बारे में विशेष रूप से दिलचस्प है कि यह cmd.exe खोल करने के लिए विशिष्ट हो गया लगता है और (और न ही शायद Win32 एपीआई में) PowerShell में नहीं होती है:

PS C:\temp\tcbugs> type 'dir1 with spaces/foo.txt' 
hi 

ब्याज का एक और मुद्दा क्या 'सीडी' के साथ निर्देशिका बदलना और cmd.exe के साथ पथ विभाजक के रूप में उपयोग किए जाने वाले '/' का उपयोग करना काम करता है:

C:\temp\tcbugs>mkdir dir2_no_spaces 

C:\temp\tcbugs>cd ./dir2_no_spaces 

C:\temp\tcbugs\dir2_no_spaces>cd .. 

फिर भी, मैं इस विशेष समस्या के लिए किसी भी संदर्भ नहीं मिल सकता है कहीं भी ऑनलाइन है और न ही MSDN के सामान्यतः उद्धृत दस्तावेज में:

Naming Files, Paths, Namespaces

कौन सा मुझे ओर जाता है पूछने के लिए: क्यों होता है, और है वहाँ एक निश्चित स्रोत है जो इस quirk दस्तावेज?

अद्यतन:

dbenham बताते हैं कि समस्या चाहे रिक्त स्थान एक निर्देशिका नाम पर कर रहे हैं की परवाह किए बिना मौजूद है, शीर्षक में इसे करने के लिए तो हटा संदर्भ और शरीर सवाल उठाते हैं। यह भी काम करता है कि 'cd ./' का एक उदाहरण जोड़ा गया है, जबकि अन्य आदेश नहीं हैं।

+5

'/' को एपीआई स्तर पर पथ विभाजक के रूप में उपयोग किया जा सकता है, लेकिन आप सीधे एपीआई को कॉल नहीं कर रहे हैं। आप cmd.exe का उपयोग कर रहे हैं, और cmd.exe '/ 'को कमांड लाइन विकल्प के रूप में पार करता है। –

+0

मुझे बहुत संदेह था, लेकिन यह भी उम्मीद है कि इस मामले को कवर करने वाले कुछ विशेष रूप से कहीं भी दस्तावेज किए जाएंगे। मैंने जो दस्तावेज पाया है, वह पथ विभाजक को कवर करता है - यहां तक ​​कि cmd शैल के संदर्भ में - इस विशेष मुद्दे का उल्लेख नहीं करता है, जहां तक ​​मैं कह सकता हूं। – Garen

+1

स्लैश कहने वाले प्रलेखन cmd.exe में पथ विभाजक के रूप में उपयोग किया जा सकता है? –

उत्तर

-6

मुझे यकीन नहीं है कि पीएस में '/' क्यों काम कर रहा है। इतिहास पर, डॉस यूनिक्स पर आधारित था और यह यूनिक्स का एक छोटा सा सेट है। यूनिक्स में पथ विभाजक '/' है, जबकि डॉस में यह '\' है। मैंने पहले कुछ विंडोज़ और डॉस एप्स पर काम किया था।

string fileNameFromWeb; 
... 
string windowsFile = fileNameFromWeb.repleace("/", @"\"); 

आप इस जोड़ सकते हैं: आदेश कमांड या पथ जैसे कुछ यूनिक्स पैटर्न बदलने और सुनिश्चित करें कि वे वैध डॉस कमांड या पथ हैं बनाने के लिए, मैं बदलने के लिए '/' के लिए '\' इस तरह एक छोटी सी कनवर्टर लिखा था विंडोज़ में फ़ाइलों तक पहुंचने के मामले में आपके ऐप में सहिष्णु '/' की सुविधा। मुझे लगता है कि पीएस में इस प्रकार कनवर्टर हो सकता है ताकि '/' या '\' का उपयोग करके कमांड या पथ को अनुमति दी जा सके, या विंडोज फ़ाइल नाम में '/' ले जाएगा।

+0

धन्यवाद, लेकिन मूल रूप से मुझे इस समस्या का सामना करने के लिए कुछ तीसरे पक्ष के सॉफ़्टवेयर में एक बग था - ताकि विकल्प मेरे लिए उपलब्ध न हो। बेशक, अगर यह मेरा सॉफ़्टवेयर था तो मैंने ऐसा कुछ किया होगा और इस सवाल से पूछने के लिए परेशान नहीं होगा। – Garen

+0

यदि आप .NET या मोनो का उपयोग कर रहे हैं, तो आप इसे हार्ड-कोडिंग के बजाय Path.DirectorySeparator का उपयोग कर सकते हैं। http://msdn.microsoft.com/en-us/library/system.io.path.directoryseparatorchar.aspx – dwerner

+6

-1 क्षमा करें, लेकिन "डॉस यूनिक्स पर आधारित था और यह यूनिक्स का एक छोटा सा सेट है।", जिसमें अब तक का सबसे बड़ा निंदा हो गया है! असल में, डीओएस कुछ हद तक [आधारित] (http://en.wikipedia.org/wiki/DOS#Origins) सीपी/एम पर था। –

8

राय दूर करने के लिए संपादित

या नहीं, विंडोज CMD.EXE आगे पथ में स्लैश, वास्तव कभी कभी यह काम करता है समर्थन करने के लिए माना जाता है, कभी कभी यह नहीं है, और कभी कभी यह काम करने के लिए प्रकट होता है, लेकिन गलत परिणाम देता है - AKA एक बग।

यह :-)

कुछ प्रयोगों के लिए समय सभी परीक्षणों विस्टा

C:\>md "c:/temp/" 

C:\>REM The forward slash works with MD! 

C:\>echo hello world 1>>"c:/temp/test.txt" 

C:\>REM Redirection works with forward slashes! 

C:\>type "c:\temp\test.txt" 
hello world 

C:\>REM Of course TYPE works with back slashes 

C:\>type "c:/temp/test.txt" 
The system cannot find the file specified. 

C:\>REM But forward slash version fails 

C:\>type "c:/temp\test.txt" 
hello world 

C:\>REM But TYPE works with forward slash as long as last slash is back slash 

C:\>dir "c:/temp/test.txt" 
Volume in drive C is OS 
Volume Serial Number is EE2C-5A11 

Directory of c:\temp 

File Not Found 

C:\>REM Note how DIR lists the directory with a \, yet fails to find any files 

C:\>dir "c:/temp/*" 
Volume in drive C is OS 
Volume Serial Number is EE2C-5A11 

Directory of c:\temp 

File Not Found 

C:\>REM DIR Still fails with forward slashes 

C:\>dir "c:/temp/" 
Volume in drive C is OS 
Volume Serial Number is EE2C-5A11 

Directory of c:\temp 

05/09/2012 09:58 PM <DIR>   . 
05/09/2012 09:58 PM <DIR>   .. 
05/09/2012 09:58 PM    13 test.txt 
       1 File(s)    13 bytes 
       2 Dir(s) 337,001,615,360 bytes free 

C:\>REM But forward slash works if no file is specified! 

C:\>dir "c:/temp\test.txt" 
Volume in drive C is OS 
Volume Serial Number is EE2C-5A11 

Directory of c:\temp 

05/09/2012 09:58 PM    13 test.txt 
       1 File(s)    13 bytes 
       0 Dir(s) 337,001,615,360 bytes free 

C:\>REM And DIR works with forward slash as long as last slash is back slash 


C:\>REM Now add another folder to the path hierarchy 

C:\>md "c:/temp/temp/" 

C:\>REM Still can create folder using forward slashes 

C:\>copy "c:/temp/test.txt" "c:/temp/temp/" 
The system cannot find the file specified. 
     0 file(s) copied. 

C:\>REM Failed to copy with forward slashes 

C:\>copy "c:/temp\test.txt" "c:/temp/temp/" 
     1 file(s) copied. 

C:\>REM But forward slash works if last slash before file name is back slash 


C:\>REM Rerun some past tests 

C:\>type "c:/temp/test.txt" 
The system cannot find the file specified. 

C:\>REM Good - it still fails 

C:\>dir "c:/temp/test.txt" 
Volume in drive C is OS 
Volume Serial Number is EE2C-5A11 

Directory of c:\temp 

05/09/2012 09:58 PM    13 test.txt 
       1 File(s)    13 bytes 
       0 Dir(s) 337,001,615,360 bytes free 

C:\>REM What is going on?! :(Why did that seem to work now? 
C:\>REM More on that later. 


C:\>REM Now test the new folder 

C:\>type "c:/temp/temp/test.txt" 
The system cannot find the file specified. 

C:\>REM Forward slashes still fail with TYPE 

C:\>type "c:/temp/temp\test.txt" 
hello world 

C:\>REM But forward slash still works as long as last slash is back slash 

C:\>dir "c:/temp/temp/*" 
Volume in drive C is OS 
Volume Serial Number is EE2C-5A11 

Directory of c:\temp\temp 

File Not Found 

C:\>REM Again, forward slashes fail, but directory path is listed properly 

C:\>dir "c:/temp/temp/" 
Volume in drive C is OS 
Volume Serial Number is EE2C-5A11 

Directory of c:\temp\temp 

05/09/2012 09:58 PM <DIR>   . 
05/09/2012 09:58 PM <DIR>   .. 
05/09/2012 09:58 PM    13 test.txt 
       1 File(s)    13 bytes 
       2 Dir(s) 337,001,615,360 bytes free 

C:\>REM And again it works if no file is specified 

C:\>dir "c:/temp/temp\test.txt" 
Volume in drive C is OS 
Volume Serial Number is EE2C-5A11 

Directory of c:\temp\temp 

05/09/2012 09:58 PM    13 test.txt 
       1 File(s)    13 bytes 
       0 Dir(s) 337,001,615,360 bytes free 

C:\>REM Again forward slashes work as long as last slash is back slash 

पर चलने रहे थे यहां एक मामला है कि स्पष्ट रूप से एक बग दर्शाता है।

c:\>dir /s /a-d temp 
Volume in drive C is OS 
Volume Serial Number is EE2C-5A11 

Directory of c:\temp 

05/10/2012 08:01 AM    13 test.txt 
       1 File(s)    13 bytes 

Directory of c:\temp\temp 

05/10/2012 07:57 AM    10 test.txt 
       1 File(s)    10 bytes 

    Total Files Listed: 
       2 File(s)    23 bytes 
       0 Dir(s) 337,325,191,168 bytes free 

c:\>REM Note the different file sizes found in each directory 

c:\>dir "c:/temp/test.txt" 
Volume in drive C is OS 
Volume Serial Number is EE2C-5A11 

Directory of c:\temp 

05/10/2012 07:57 AM    10 test.txt 
       1 File(s)    10 bytes 
       0 Dir(s) 337,325,191,168 bytes free 

c:\>REM It is listing the wrong file! 

कोई बहस कर सकता है कि विंडोज सीएमडी आगे की स्लैश का समर्थन करने के लिए "माना" है या नहीं। लेकिन वह अंतिम परिणाम एक बग है! यहां तक ​​कि अगर फॉरवर्ड स्लैश का उपयोग करने में ऑपरेटर त्रुटि है, तो विंडोज को वह परिणाम नहीं देना चाहिए।

+0

+1! –

+3

व्यवहार को बग के रूप में वर्णित करने का आपका आधार क्या है? (जैसा कि रेमंड चेन ने ऊपर पूछा था, दस्तावेज कहां कहता है कि 'cmd' को पथ विभाजक के रूप में आगे की स्लैश स्वीकार करनी चाहिए?) और लैरी ओस्टर्मन [नोट किया गया] (http://blogs.msdn.com/b/larryosterman/archive/2005 /06/24/432386.aspx), विकल्प विभाजक के रूप में आगे स्लैश के उपयोग की उत्पत्ति माइक्रोसॉफ्ट के काम भी नहीं हो सकती है। क्या आप यूनिक्स-परंपरा कमांड के व्यवहार को "बग" के रूप में वर्णित करेंगे जो विशेष व्यवस्था के बिना '-' से शुरू होने वाले फ़ाइल नामों से निपट नहीं सकता है? –

+6

@BrianNixon - यदि कोई सिस्टम असंगत परिणाम देता है तो मैं इसे एक बग (या डिज़ाइन दोष) मानता हूं।अगर सीएमडी पथों में आगे स्लैश के साथ काम करता है या नहीं करता है, तो मैं पूरी तरह से खुश हूं, लेकिन कभी-कभी काम करने के लिए और दूसरी बार मेरी पुस्तक में एक बग नहीं है। और संपादित उत्तर में मेरा आखिरी उदाहरण स्पष्ट रूप से "बग" की किसी भी तर्कसंगत परिभाषा द्वारा एक बग का प्रदर्शन करता है जिसे मैं सोच सकता हूं। मैंने जवाब से राय हटा दी है और तथ्यों पर अटक गया है। लेकिन इस टिप्पणी में मैं कहूंगा: "मेरा मानना ​​है कि एमएस ने पथों में आगे की कमी का समर्थन करने का प्रयास किया और एक छोटी गाड़ी रहित दस्तावेज के साथ समाप्त हुआ"। – dbenham

-1

कितने को स्लैश के साथ कुछ अजीब व्यवहार किया था और हम इसे इस तथ्य के नीचे का पता लगाया, कि एक अग्रणी स्लैश के साथ एक पथ एक निरपेक्ष पथ के रूप में नहीं देखा जाता है, तो

C:\>cd /temp 

C:\temp>rem works we are in the root directory 

C:\temp>cd /temp 
Das System kann den angegebenen Pfad nicht finden. 

C:\temp>rem does't work but 

C:\temp>cd \temp 

C:\temp>rem \ indicates absolute path 

C:\temp>cd .. 

C:\>cd /temp 

C:\temp> cd /ca 

C:\temp\CA>rem qed 

शायद यह भी बताते हैं ऊपर बताई गई बग - मैं स्पष्ट नहीं हूं, किस निर्देशिका पर आदेश निष्पादित किए जाते हैं।

+0

अच्छा सिद्धांत, लेकिन मेरी विंडोज 7 मशीन पर मुझे अलग व्यवहार मिलता है। 'cd/temp' मेरे लिए ठीक काम करता है, इसे रूट फ़ोल्डर के रूप में व्यवहार करता है। लेकिन मेरी पोस्ट में सूचीबद्ध अन्य बग अभी भी लागू होते हैं। – dbenham

+0

ये दिलचस्प उदाहरण हैं, लेकिन वे "क्यों" के प्रश्न को संबोधित करना शुरू नहीं करते हैं। –