विंडोज: फ़ाइल कॉपी / फ़ाइल नाम के साथ नियमित रूप से चलती है?


10

मैं मूल रूप से चलाना चाहता हूं :

C:\>xcopy [0-9]{13}\.(gif|jpg|png) s:\TargetFolder /s

मुझे पता xcopyहै कि नियमित-अभिव्यक्ति फ़ाइलनाम खोजों का समर्थन नहीं करता है।

मुझे पता नहीं चला कि कैसे पता लगाया जा सकता है कि पावरशेल में Cmdletफ़ाइलों को कॉपी करने के लिए क्या है; और यदि ऐसा होता है, तो यह कैसे पता लगाया जाए कि क्या यह नियमित अभिव्यक्ति फ़ाइल नाम मिलान का समर्थन करता है।

किसी को भी एक reursx फ़ाइल नाम मिलान के साथ एक पुनरावर्ती फ़ाइल प्रतिलिपि / चाल करने का एक तरीका सोच सकते हैं?


1
यह सही stackoverflow करने के लिए ले जाया जाना चाहिए?
user33788

1
@smoknheap: यह दोनों हो सकता है, मुझे लगता है कि पॉवर्सशैल स्क्रिप्टिंग अधिक से अधिक एक पावर यूजर टूल बन रहा है। यह एक xcopy प्रतिस्थापन प्रश्न और फिर एक स्क्रिप्टिंग प्रश्न का अधिक है।
डॉल्कटनुकल

जवाबों:


5

मुझे लगता है जब मैं कर सकता हूँ सभी शक्तियों का उपयोग करना पसंद है। थोड़ा परीक्षण करने के बाद, यह सबसे अच्छा मैं कर सकता हूं।

$source = "C:\test" 
$destination = "C:\test2" 
$filter = [regex] "^[0-9]{6}\.(jpg|gif)"

$bin = Get-ChildItem -Path $source | Where-Object {$_.Name -match $filter} 
foreach ($item in $bin) {Copy-Item -Path $item.FullName -Destination $destination}

पहली तीन पंक्तियाँ सिर्फ पढ़ने के लिए आसान बनाने के लिए हैं, यदि आप चाहें तो आप वास्तविक आदेशों के अंदर चर को परिभाषित कर सकते हैं। इस कोड नमूने की कुंजी "व्हेयर-ऑब्जेक्ट" कमांड है जो एक फिल्टर है जो नियमित अभिव्यक्ति मिलान को स्वीकार करता है। यह ध्यान दिया जाना चाहिए कि नियमित अभिव्यक्ति का समर्थन थोड़ा अजीब है। मुझे यहां एक पीडीएफ संदर्भ कार्ड मिला जिसमें बाईं ओर समर्थित वर्ण हैं।

[संपादित करें]

जैसा कि "@ जोहान्स रोसेल" ने कहा है, आप अंतिम दो पंक्तियों को एक पंक्ति में भी घटा सकते हैं।

((Get-ChildItem -Path $source) -match $filter) | Copy-Item -Destination $destination

मुख्य अंतर यह है कि जोहान्स का तरीका ऑब्जेक्ट फ़िल्टरिंग करता है और मेरा तरीका टेक्स्ट फ़िल्टरिंग करता है। पॉवरशेल के साथ काम करते समय, वस्तुओं का उपयोग करना लगभग हमेशा बेहतर होता है।

[EDIT2]

जैसा कि @smoknheap ने उल्लेख किया है, उपरोक्त स्क्रिप्ट फ़ोल्डर संरचना को समतल कर देगी और आपकी सभी फ़ाइलों को एक फ़ोल्डर में डाल देगी। मुझे यकीन नहीं है कि एक स्विच है जो फ़ोल्डर संरचना को बरकरार रखता है। मैंने -Rururse स्विच की कोशिश की और यह मदद नहीं करता है। मुझे काम करने का एकमात्र तरीका स्ट्रिंग हेरफेर करने के लिए वापस जाना है और अपने फ़िल्टर में फ़ोल्डरों को जोड़ना है।

$bin = Get-ChildItem -Path $source -Recurse | Where-Object {($_.Name -match $filter) -or ($_.PSIsContainer)}
foreach ($item in $bin) {
    Copy-Item -Path $item.FullName -Destination $item.FullName.ToString().Replace($source,$destination).Replace($item.Name,"")
    }

मुझे यकीन है कि ऐसा करने का एक और अधिक सुंदर तरीका है, लेकिन मेरे परीक्षणों से यह काम करता है। यह सब कुछ इकट्ठा करता है और फिर नाम और फ़ोल्डर ऑब्जेक्ट दोनों के लिए फ़िल्टर करता है। मुझे स्ट्रिंग हेरफेर तक पहुंच प्राप्त करने के लिए ToString () विधि का उपयोग करना पड़ा।

[EDIT3]

अब यदि आप यह सुनिश्चित करना चाहते हैं कि आपके पास सब कुछ सही है, तो यह सुनिश्चित करने के लिए रास्ते की रिपोर्ट करें। आप "राइट-होस्ट" कमांड का उपयोग कर सकते हैं। यहां वह कोड है जो आपको कुछ संकेत देगा कि क्या चल रहा है।

cls
$source = "C:\test" 
$destination = "C:\test2" 
$filter = [regex] "^[0-9]{6}\.(jpg|gif)"

$bin = Get-ChildItem -Path $source -Recurse | Where-Object {($_.Name -match $filter) -or ($_.PSIsContainer)}
foreach ($item in $bin) {
    Write-Host "
----
Obj: $item
Path: "$item.fullname"
Destination: "$item.FullName.ToString().Replace($source,$destination).Replace($item.Name,"")
    Copy-Item -Path $item.FullName -Destination $item.FullName.ToString().Replace($source,$destination).Replace($item.Name,"")
    }

यह संबंधित स्ट्रिंग्स को वापस करना चाहिए। अगर आपको कहीं कुछ नहीं मिलता है, तो आपको पता चल जाएगा कि किस चीज में कोई समस्या है।

उम्मीद है की यह मदद करेगा


ध्यान दें कि आपको $item.FullNameवहां उपयोग करने की आवश्यकता नहीं है - यदि आप FileInfo ऑब्जेक्ट (imho, पास नहीं करते हैं, तो आपको उपयुक्त संपत्ति अपने आप मिल जाती है, क्योंकि PowerShell की पावर स्ट्रक्चर्ड ऑब्जेक्ट्स से गुजरती है, स्ट्रिंग नहीं)। इसके अलावा, आप एक पाइपलाइन में सब कुछ डाल सकते हैं: ((gci $source) -match $filter) | cp -dest $destination(संक्षिप्तता के लिए थोड़ा अनुकूलित - बदलने के लिए स्वतंत्र महसूस कर रहा हूं; मैं सिर्फ यह कह रहा हूं कि foreachयह अनावश्यक है)।
जॉय

जब मैं इसका परीक्षण कर रहा था, मैं वस्तुओं को सही ढंग से पाइप करने के लिए नहीं मिला। यह बारी है मुझे फोर्क कमांड का उपयोग करने के लिए मजबूर करती है। मैं आपके कोड को आज़माता हूँ और देखता हूँ कि क्या होता है। यह बात बताने के लिए धन्यवाद।
Doltknuckle

क्या यह मेरी जैसी ही समस्या है जहाँ यह गंतव्य निर्देशिका को समतल करता है? xcopy आमतौर पर गंतव्य निर्देशिका पर निर्देशिका संरचना को संरक्षित करेगा, है ना?
user33788

Copy-Item : Cannot bind argument to parameter 'Path' because it is null
इयान बोयड

कृपया ध्यान दें कि Trimकिसी स्ट्रिंग को दूसरे स्ट्रिंग के अंत से हटाने का इरादा नहीं है, इसके बजाय यह स्ट्रिंग के आरंभ और अंत से पैरामीटर स्ट्रिंग के सभी उदाहरणों को हटाता है। आपके मामले में यदि $item.Nameकोई पूंजी C शामिल है, तो यह स्ट्रिंग की शुरुआत से ड्राइव अक्षर C को भी हटा देगा।
एंड्रीस

3

PowerShell उस कार्य के लिए एक उत्कृष्ट उपकरण है। आप प्रतिलिपि प्रक्रिया के लिए प्रतिलिपि-आइटम cmdlet का उपयोग कर सकते हैं । आप इसे जटिल प्रतिलिपि आदेशों के लिए अन्य cmdlets के साथ पाइपलाइन कर सकते हैं, यहां कोई ऐसा व्यक्ति है जिसने वास्तव में ऐसा किया है :)

System.Text.RegularExpressions नामस्थान से .NET RegEx वर्ग का उपयोग नियमित रूप से किया जाता है, इन कक्षाओं में त्वरित कैसे हो

PowerShell में -match और -replace ऑपरेटर भी हैं जिनका उपयोग कॉपी-आइटम के साथ पाइपलाइन करते समय किया जा सकता है

RegEx को स्वयं बनाने में मदद करने के लिए भी उपकरण हैं, जैसे RegEx दोस्त


Imho, -matchऔर -replaceमें जाने से पहले उल्लेख किया जाना चाहिए System.Text.RegularExpressions.RegEx। कम से कम मेरे लिए, मैं शायद ही कभी [regex]सीधे उपयोग करता हूं; हालांकि मैं है का उपयोग अक्सर -matchऔर -replaceऑपरेटरों। रेग्युलर एक्सप्रेशन्स बनाने के लिए मैंने पाया कि आप जो भी लिख रहे हैं एक रेगेक्स को जांचने और निखारने में पॉवरशेल काफी उपयोगी है।
जॉय

मैंने इस प्रश्न में आपके उत्तर का जवाब मांगा है: superuser.com/questions/149808/…
Ian Boyd

0

एक विचार के रूप में, लेकिन कुछ काम की जरूरत है

dir -r | ; {$ _ -मंच '[0-9] {13} \ _ (gif | jpg | png)'} | % {xcopy $ _। फुलनाम c: \ temp}

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