2017-06-15 5 views
30

मेरे फ़ाइल सर्वर पर काम करते समय, मैंने एक स्क्रिप्ट फ़ोल्डर देखा है जिसने मेरी स्क्रिप्ट तोड़ दी है। फ़ोल्डर में एसिसी मान 160 (non-breaking space, एनबीएसपी) के साथ केवल एक वर्ण शामिल है। दृश्यमान रूप से वह नाम अंतरिक्ष चरित्र जैसा ही है।गेट-चाइल्डइटम और गैर-ब्रेकिंग स्पेस

संक्षेप में, मेरे पास इस फ़ोल्डर पर Get-ChildItem निष्पादित किया जा रहा है और यह अंतहीन पाश में प्रवेश कर रहा है। कमांड वास्तविकता में मूल फ़ोल्डर के खिलाफ निष्पादित किया गया है और यह फिर से समस्याग्रस्त फ़ोल्डर लौटाता है, इसलिए मेरी स्क्रिप्ट अंतहीन पाश में आ गई।

आप आसानी से इसे अपने पर्यावरण पर अनुकरण कर सकते हैं। C:\temp फ़ोल्डर में नया फ़ोल्डर बनाएं जिसका नाम केवल एनबीएसपी है। आप इसे होल्डिंग alt के साथ टाइप कर सकते हैं और संख्यात्मक कीबोर्ड पर 0160 दबा सकते हैं। इसे बनाने के बाद,

Get-ChildItem C:\Temp\ -Recurse 

आपको बिना नाम के फ़ोल्डर की अंतहीन सूची मिल जाएगी, हालांकि मेरे पास केवल एक फ़ोल्डर है।

d-----  6/15/2017 2:20 PM 
d-----  6/15/2017 2:20 PM 
d-----  6/15/2017 2:20 PM 
d-----  6/15/2017 2:20 PM 
d-----  6/15/2017 2:20 PM 
. . . 

मैंने सर्वर और क्लाइंट ओएस पर PowerShell 4 और 5 के साथ इसका परीक्षण किया और यह वही व्यवहार है। कमांड Get-Item इस नाम के साथ भी जारी है, और -Path और -LiteralPath दोनों स्विच एक ही तरीके से व्यवहार कर रहे हैं। मैंने [System.IO.Directory] कक्षा भी कोशिश की, लेकिन यह एक ही मुद्दा था।

प्रश्न: मैंने इस नाम के साथ फ़ोल्डर्स को एक त्रुटि के रूप में रिपोर्ट करने और इसे छोड़ने के लिए अपनी स्क्रिप्ट अपडेट की है, लेकिन मुझे आश्चर्य है कि ऐसा करने के लिए कुछ और स्मार्ट तरीका है? मेरा लक्ष्य Get-ChildItem या ऐसे फ़ोल्डर के बराबर चलाने के लिए होगा।

क्या यह ज्ञात मुद्दा है? यदि अधिक लोगों द्वारा पुष्टि की जाती है, तो इसे कहीं भी बग के रूप में रिपोर्ट करने लायक होगा?

+6

हां, मैं यह भी देखना । निश्चित रूप से एक बग। 'DirectoryInfo' मेरे लिए काम करता है:' ([IO.DirectoryInfo] 'c: \ temp')। EnumerateFileSystemInfos ('*', 'AllDirectories') ' – wOxxOm

+0

मैं इसकी पुष्टि भी कर सकता हूं और निस्संदेह यह किसी भी तरह शोषक है। मैं आपको इसकी रिपोर्ट करने के लिए प्रोत्साहित करता हूं। –

+0

@wOxxOm क्या आप अभी भी उस एनबीएसपी फ़ोल्डर में भर्ती कर सकते हैं जिसमें इसमें कोई अन्य फ़ोल्डर होना चाहिए? साथ ही, क्या आप सचमुच एनबीएसपी फ़ोल्डर के बारे में dirinfo प्राप्त कर सकते हैं न कि सिर्फ "temp"? – Vesper

उत्तर

0

जैसा कि टिप्पणी में उल्लेख किया गया है, आपको एक वास्तविक त्रुटि मिली है जो जल्द ही तय हो जाएगी।

हालांकि एक बहुत स्वीकार्य कामकाज है कि आप अपने फ़ोल्डर को बाहर करने की आवश्यकता के बिना Get-ChildItem का उपयोग जारी रखने के दौरान न्यूनतम प्रयास के साथ आवेदन कर सकते हैं।

गेट-चाइल्डइटम का यूनिकोड संस्करण इस समस्या से ग्रस्त नहीं है। (एक Windows 10 पर्यावरण पर Powershell 5.1 पर परीक्षण किया गया) के लिए इसका इस्तेमाल करने के लिए बस

Get-ChildItem -LiteralPath '\\?\c:\__tmp' -recurse 

अतिरिक्त नोट

द्वारा

Get-ChildItem -Path 'c:\__tmp' -recurse 

की जगह आप यूएनसी से निपटने के लिए की जरूरत है, यूएनसी यूनिकोड कॉल थोड़ा अलग है।

Get-ChildItem -LitteralPath '\\?\UNC\127.0.0.1\c$\__tmp' -recurse 

सूचना है कि मैं इस ठीक से -path का काम करने के लिए -LiteralPath पैरामीटर का उपयोग करें।

संदर्भ

माइक्रोसॉफ्ट प्रलेखन

-LiteralPath

से एक या अधिक स्थान के लिए एक रास्ता निर्दिष्ट करता है। -पैथ पैरामीटर के विपरीत, -LiteralPath पैरामीटर का मान ठीक उसी प्रकार उपयोग किया जाता है जैसा इसे टाइप किया गया है। वाइल्डकार्ड के रूप में कोई वर्ण नहीं समझा जाता है। यदि पथ में भागने वाले पात्र शामिल हैं, तो इसे एकल उद्धरण चिह्नों में संलग्न करें। एकल उद्धरण चिह्न विंडोज पावरशेल को बताते हैं कि किसी भी वर्ण को बचने के क्रम के रूप में नहीं समझना है।

source

यूनिकोड उपसर्ग सम्मेलन के बारे में: Naming Files, Paths, and Namespaces

बोनस यूनिकोड कॉल भी 260 पात्रों पथ की लंबाई की सीमा को सुलझाने का लाभ: see here

संबंधित मुद्दे