मुझे लगता है जब मैं कर सकता हूँ सभी शक्तियों का उपयोग करना पसंद है। थोड़ा परीक्षण करने के बाद, यह सबसे अच्छा मैं कर सकता हूं।
$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,"")
}
यह संबंधित स्ट्रिंग्स को वापस करना चाहिए। अगर आपको कहीं कुछ नहीं मिलता है, तो आपको पता चल जाएगा कि किस चीज में कोई समस्या है।
उम्मीद है की यह मदद करेगा