2009-02-09 5 views
20

मेरी PowerShell स्क्रिप्ट में, मैं फ़ाइलों की एक संख्या से अधिक का चयन करें-स्ट्रिंग चल रहा हूँ, एक चर के माध्यम से एक स्ट्रिंग यह में पारित कर दिया की तलाश में ($ आईडी):PowerShell स्ट्रिंग चर में संग्रहीत एस्केप अनुक्रमों को कैसे अनदेखा करें?

foreach ($file in (ls "path\to\files")) { 
    $found = $false 
    $found = Select-String -Path $file $id -Quiet 
    if ($found) { 
     break 
    } 
} 

दुर्भाग्य से, $ आईडी चर कभी कभी बातें जैसे "\ C" या "\ T", जो चयन-स्ट्रिंग भागने के दृश्यों के रूप में व्याख्या करने का प्रयास करता है। ये मान्य बचने के अनुक्रम नहीं हैं, इसलिए चयन-स्ट्रिंग एक त्रुटि फेंकता है। वे बचने के अनुक्रमों का इरादा नहीं रखते हैं (उदाहरण के लिए, यह "सी: \ टेस्ट" जैसे फ़ाइल पथ का हिस्सा हो सकता है), तो मैं उन्हें पावरशेल/सिलेक्ट-स्ट्रिंग को इस तरह समझने से कैसे रोक सकता हूं? मैंने बिना किसी भाग्य के $ 74 के आसपास कोष्ठक का उपयोग करने का प्रयास किया है।

+0

जो भी अनुपयोगी टिप्पणी को हटा देता है, धन्यवाद :-) – alastairs

उत्तर

32

उपयोग स्थिर escape() विधि है, यह नियमित अभिव्यक्ति इंजन इन पात्रों की व्याख्या करने के सचमुच के बजाय के रूप में अक्षरों से परे का निर्देश:

$id = [regex]::escape($id) 

तुम भी एक एक लाइनर के लिए आदेश को बदल सकते हैं (-path का एक संग्रह ले जा सकते हैं फ़ाइलें):

Select-String -Path path\to\files\\* -Pattern ([regex]::escape($id)) -Quiet 
+0

इसने इसे क्रैक किया, बहुत बहुत धन्यवाद !! – alastairs

+0

मैं एक लाइनर के लिए एक और +1 दूंगा, अगर मैं दो बार मतदान कर सकता हूं। :-) – Tomalak

+0

अफसोस की बात है कि एक लाइनर विशिष्ट स्थिति के लिए काम नहीं करता है - मैंने एक -फिल्टर और ए-रेसर पैरामीटर – alastairs

0

जब यह आप के लिए पारित किया है तो मैं विधि में बनाया सुरक्षित रूप से इसे वापस "\ t" करने के लिए से बचने के लिए एक के बारे में पता नहीं कर रहा हूँ $ id स्ट्रिंग पहले से ही टैब की तरह कुछ में शामिल हैं। आपको यह सुनिश्चित करने की ज़रूरत है कि आपकी स्क्रिप्ट पहली जगह सही स्ट्रिंग पास हो गई हो। अर्थात। इसे 0x5C74 (\ t) 0x09 (TAB) पास करने की आवश्यकता नहीं है। इसलिए जब खोज स्ट्रिंग को पहली बार परिभाषित किया जाता है तो भागने की आवश्यकता होती है।

Regex.Escape टैब बच जाएंगे -> \ t लेकिन यह भी इन पात्रों कि नियमित अभिव्यक्ति के भीतर अर्थ है की किसी भी बच जाएंगे:

\, *, +,, |, {, [, (,)? , ^, $,।, #, और सफेद स्थान

उदाहरण  । -> \।

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