2013-06-04 3 views
5

मुझे पावरशेल में नाम बदलने-स्क्रिप्ट बनाने में काफी परेशानी हो रही है। स्थिति: एक निर्देशिका मैं निम्नलिखित प्रारूप के साथ नामक फ़ोल्डर है में: "चार अंक - पाठ - जंक" कौन सा मैं के नाम बदलना चाहते हैं "पाठ (चार अंक)"पावरशेल रेगेक्स ग्रुपिंग

अभी मैं बनाया है कुछ नमूना नाम के साथ एक निर्देशिका के साथ चारों ओर खेलने के लिए:

1996 - कुछ दिलचस्प - कुछ भद्दा

2006 - इस कॉपी - उपेक्षा प्रतिध्वनित करने के लिए एक स्क्रिप्ट की स्थापना

मैं कोशिश की है उनके नाम शुरू करने के लिए लेकिन मैं regex की लटका नहीं मिल सकता है। निम्नलिखित कोड सिर्फ प्रिंट "1996 - कुछ" और "2006 - प्रतिलिपि"

Get-ChildItem | Foreach-Object { if ($_.BaseName -match "(\d{4} - \w+ -*)") { echo $matches[0]}} 

और यह एक प्रिंट होगा "1996 - कुछ दिलचस्प - कुछ भद्दा \ n()" और "2006 - कॉपी इस - उपेक्षा \ एन() "

Get-ChildItem | Foreach-Object { echo ($_.BaseName -replace "(\d{4} - \w+ - *)"), "$2 ($1)"} 

क्या कोई मुझे बता सकता है कि क्यों न तो दृष्टिकोण मिलान के लिए सीमा के रूप में शाब्दिक स्ट्रिंग का सम्मान करता है? इस से पहले अनुगामी अंतरिक्ष ट्रिम करने के लिए है -

Get-ChildItem | Foreach-Object { 
    if ($_.BaseName -match "(\d{4} - [^-]*)") { 
     echo $matches[0].TrimEnd() 
    } 
} 

नोट TrimEnd:

* संपादित करें * धन्यवाद zespri, कोड है कि मेरी समस्या हल

Get-ChildItem | Foreach-Object { 
if ($_.BaseName -match "(\d{4} - [^-]*)") { 
    Rename-Item $_ ($_.BaseName -replace "(\d{4}) - (.+)(?= -).*" ,'$2 ($1)') 
    } 
} 

उत्तर

5

विल आप के लिए यह काम है दूसरा डैश

क्यों आपके उदाहरण काम नहीं करते हैं: \ w + किसी भी शब्द चरित्र से मेल खाता है, इसलिए यह "कुछ दिलचस्प" के अंदर की जगह से मेल नहीं खाएगा। * शून्य या अधिक मतलब है। तो - * आपके मामले में शून्य या अधिक डैश से मेल खाता है - शून्य।

एक और तरीका है एक अभिव्यक्ति है कि आप के लिए काम कर सकते हैं लिखने के लिए:

Get-ChildItem | Foreach-Object { 
    if ($_.BaseName -match "(\d{4} - .+(?= -))") { 
     echo $matches[0] 
    } 
} 

जहां (?= -) निर्माण positive lookahead assertion इस मामले में आप के रूप में यह जिम्मेदार है अंत में अतिरिक्त जगह ट्रिम करने की आवश्यकता नहीं है नियमित अभिव्यक्ति में खुद के लिए।

अद्यतन 1

परिवर्तन करने के लिए संशोधित:

gci | %{ $_.BaseName -replace "(\d{4}) - (.+)(?= -).*" ,'$2 ($1)' } 
+0

यह जो कि हाँ से मेल के नाम गूंज जाएगा, कि में एक कदम है सही दिशा अब इसके साथ कुछ करने के लिए: "कुछ दिलचस्प (अंक)" के लिए सुधार। मैंने दो हिस्सों को लपेटने की कोशिश की है जिन्हें मैं ब्रांड्स में निकालना चाहता हूं और उन्हें $ मैचों के माध्यम से निकालना चाहता हूं [0] समूह [] á la http://stackoverflow.com/questions/614651/how-do-you-extract-the -उत्पादन-ए-रेगेक्स-बैकरेफर-मैच-इन-पावरहेल लेकिन यह वैध ऑपरेटर नहीं है।मैंने उनमें से नामित और अज्ञात समूह करने का भी प्रयास किया है, लेकिन मुझे पूरे पाठ के अलावा कुछ भी नहीं मिल सकता है, या जंक के बाद कोष्ठक की एक खाली जोड़ी नहीं मिल सकती है। – Glader

+0

@Glader: मैं उम्मीद कर रहा था कि सही दिशा में एक कोमल नज पर्याप्त होगा =)। मैंने कोड को जोड़ने के लिए उत्तर को संशोधित किया है जो नामों को दोबारा सुधारता है। –

+0

तो मेरे पास था, लेकिन मैं अपने जीवन के लिए उचित विधि को समझ नहीं पाया .. पहले रेगेक्स पर एकाधिक या 'चार मांगों आदि को जोड़कर कोशिश की गई लेकिन गधे में मुझे कुछ काट रहा है। ^^ बहुत बहुत धन्यवाद, मैंने अपनी मूल पोस्ट को उस कोड के साथ अपडेट किया है जिसके साथ मैं गया था। – Glader

0

आज़माएं:

Get-ChildItem | 
    Select-String -Pattern '(\d{4})\s+-\s+(\w+(\s+\w+)*)\s+-.*' | 
    Foreach-Object { "$($_.Matches.Groups[2].Value) ($($_.Matches.Groups[1].Value))"