कई फ़ाइलों का नाम बदलकर PowerShell, फ़ाइल नाम का विशिष्ट भाग


5

मैं कई फ़ाइलों का नाम बदलने का प्रयास कर रहा हूं जिनमें फ़ाइलनाम एक ही तरह से समाप्त हो रहे हैं। ये फाइलें वर्तमान में हैं: "फू बार (यू) (वी 7.9) (यूएसए) .txt" "कुछ बेर डू बेर (यू) (वी 7.9) (यूएसए) .txt" ect के।

मैं नाम के "(U) (V7.9) (यूएसए)" खंड को हटाने की कोशिश कर रहा हूं और इस खंड को (यूएसए) से प्रतिस्थापित कर रहा हूं। इन फ़ाइलों को तब नाम दिया जाएगा: "फू बार (यूएसए) .txt" "कुछ बेर डू बेर (यूएसए) .txt"।

मैं इसे काम करने के लिए काफी नहीं मिल सकता, लेकिन यहाँ है कि मैं कोई फायदा नहीं हुआ:

get-childItem '* (U) (V7.9) (USA).txt' | rename-item -newname { $_.name -replace '(U) (V7.9) (USA)','(USA)' }

जवाबों:


7

जिन पात्रों को आप बदलने की कोशिश कर रहे हैं, उनमें से कई regex में विशेष वर्ण हैं। उनके पास विशेष, आरक्षित अर्थ हैं जो आपको जटिल अभिव्यक्तियों को बनाने की अनुमति देते हैं जब वे "बच गए" नहीं होते हैं। उन्हें बचने के लिए, आपको बस विशेष चरित्र के बैकस्लैश infront शामिल करने की आवश्यकता है। उदाहरण:

PS C:\> $string = "(U) (V7.9) (USA)"

#Failure
PS C:\> $string -replace "(U) (V7.9) (USA)", "(USA)"
(U) (V7.9) (USA)

#Success
PS C:\> $string -replace "\(U\) \(V7\.9\) \(USA\)", "(USA)"
(USA)

यदि आप इसी तरह की समस्याओं में भाग लेते हैं, तो यहां एक पॉवर्सशेल रेगेक्स संदर्भ है। आप देख सकते हैं कि बैकस्लैश के बजाय बैकटिक `वर्ण का उपयोग किया जाता है - बैकटेक पावरशेल में एस्केप कैरेक्टर है, लेकिन यह .NET में सभी regex हैंडलिंग के लिए सही नहीं है (जो Powershell पर बनाया गया है)। उसके कारण, आप इंटरनेट पर शक्तियों के लिए रेगेक्स उदाहरणों में दोनों का उपयोग कर सकते हैं।


1
आपकी मदद के लिए धन्यवाद और विलंबित पोस्ट के लिए खेद है। मुझे किसी कारण से "$ string -replace" से थोड़ी कठिनाई हो रही थी, लेकिन यहाँ मैंने जो प्रयोग किया है वह मेरे लिए पूरी तरह से काम करता है: get-childItem '*(U) (V7.9) (USA)*' | rename-item -newname { $_.name -replace '\(U\) \(V7.9\) \(USA\)','(USA)' }
root

2

यदि आप केवल "(U) (V7.9)" भाग को निकालना चाहते हैं, तो आप भी उपयोग कर सकते हैं:

-replace("\(U\) \(V7.9\) ","")

लेकिन आपको पैरेन्थेस के लिए एस्कैप्रेचर का भी इस्तेमाल करना होगा। और निम्नलिखित स्पेसचैकर को न भूलें, क्योंकि हम डबल्सस्पेस प्राप्त नहीं करना चाहते हैं।

भी substring(start,length)विधि का उपयोग करने के लिए एक विकल्प theres । लेकिन वहां आपको "(यू) (V7.9)" भाग की शुरुआत की गणना करनी होगी।

$string = "Randomname (U) (V7.9) (USA).txt"
$string.substring(0, $string.length - 20) + $string.substring($string.length - 9)

जो आउटपुट देता है Randomname (USA).txt

20वर्ण की संख्या स्ट्रिंग के प्रथम वर्ण के लिए (पीठ पर शुरुआत) को हटाने के लिए (: इस मामले में है (की (U))। 9स्ट्रिंग के बाद पहली चरित्र के लिए वर्ण (पीठ पर शुरुआत) की संख्या को हटाने के लिए है (इस मामले में: (की (USA), क्योंकि हम एक डबल अंतरिक्ष प्राप्त करना चाहते हैं न)।

यह विधि लंबाई से स्वतंत्र है, Randomnameलेकिन केवल ज्ञात स्थिति और हटाने के लिए स्ट्रिंग की लंबाई के साथ काम करती है। वैसे भी -replace-Method का उपयोग करना आसान है, अगर आप escapechararcter को जानते हैं। मैं सिर्फ वांछित आउटपुट प्राप्त करने के लिए एक अन्य तरीके का उल्लेख करना चाहता था।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.