2012-04-03 15 views
13

का उपयोग करके सब कुछ कॉपी करें, मैं एक पावरशेल स्क्रिप्ट लिखने में सक्षम होना चाहूंगा जो एक फ़ोल्डर (या फ़ोल्डरों का सेट) ले लेगा और उन्हें डुप्लिकेट करने के लिए जिसमें फ़ोल्डर संरचना (बिना फाइलें) बनाई जा सकती हैं, जहां फ़ाइल संरचना (फ़ोल्डरों के बिना) बनाई जा सकती है, या जिसमें दोनों फाइलें (सभी या चयनित वाले) और फ़ोल्डर्स बनाए जा सकते हैं।फ़ाइलों के बिना फ़ोल्डर्स, फ़ोल्डर्स के बिना फाइलें, या पावरशेल

Example: 

    C:\ProdData has 3 subfolders in it 
    C:\ProdData\Fld1 
    C:\ProdData\Fld2 
    C:\ProdData\Fld3 - has 2 subfolders under it 
    C:\ProdData\Fld3\MyFolder1 
    C:\ProdData\Fld3\MyFolder2 

उपरोक्त प्रत्येक फ़ोल्डर में विभिन्न फ़ाइल एक्सटेंशन के विभिन्न आकारों की विभिन्न संख्याएं हैं।

मैं एक PowerShell स्क्रिप्ट जो कि फ़ोल्डर संरचना कहीं और नकल होता है करने के लिए मुझे फ़ोल्डर संरचना केवल, फ़ाइलें केवल, या फ़ाइलों और फ़ोल्डरों कॉपी करने का एक विकल्प देने के लिए चाहते हैं।

ऊपर में, मैं सी कॉपी करने के लिए सक्षम होने के लिए करना चाहते हैं: किसी अन्य फ़ोल्डर में \ ProdData, अनिवार्य रूप से TestData को ProdData का नाम बदलने (अर्थात, सी है: \ ProdDataसी में कॉपी किया: \ TestData), या पूरे फ़ोल्डर संरचना की प्रतिलिपि बनाने के लिए।

कुछ और का एक सबफ़ोल्डर है कि किसी अन्य फ़ोल्डर में C:\ProdData: C:\TestArea\TestFolders\2012-04-01\TestData\ProdData\Fld1, आदि ...

और चुनिंदा फोल्डर, फाइल या दोनों शामिल करने के लिए चुनें।

आदर्श समाधान (केवल फ़ोल्डर्स के लिए) फ़ोल्डर संरचना लेना, निर्यात/सहेजना, इसे पढ़ना, और उसी संरचना को कहीं और बनाना होगा। कुछ समाधान मैंने पाया है कि उन्होंने केवल फ़ोल्डर संरचना की प्रतिलिपि बनाई है, लेकिन यदि डेटा मौजूद है, तो यह भी कॉपी हो जाता है और आप एक या दूसरे को बाहर नहीं कर सकते हैं। मैं केवल फाइलों-आवश्यकता है कि पथ अर्द्ध बरकरार रखता है के लिए एक आंशिक समाधान है, लेकिन यह एक फ़ाइल ले जाएगा:

c:\ProdData\Fld1\MyFile.dat 

और इसे करने के लिए कॉपी:

c:\TestData\yyyyMMdd_hhmmss_ProdData_Fld1_MyFile.dat 

लेकिन वह कुछ ऐसा है जो कर सकते थे नहीं है आसानी से डीकोड किया जा सकता है और स्रोत संरचना को फिर से एकीकृत करना असंभव होगा। मैं इस पहिये को फिर से आविष्कार किए बिना इसे पूरा करने के बारे में किसी भी विचार की सराहना करता हूं।

उत्तर

13

एक फ़ोल्डर hierarchie में सब कुछ कॉपी करने के लिए

Copy-Item $source $dest -Recurse -Force 

hierarchie कॉपी करने के लिए आप की कोशिश कर सकते हैं:

$source = "C:\ProdData" 
$dest = "C:\TestData" 
Copy-Item $source $dest -Filter {PSIsContainer} -Recurse -Force 

एक फ़ाइल संरचना समतल करने के लिए आप की कोशिश कर सकते हैं:

$source = "C:\ProdData" 
$dest = "C:\TestData" 
New-Item $dest -type directory 
Get-ChildItem $source -Recurse | ` 
    Where-Object { $_.PSIsContainer -eq $False } | ` 
    ForEach-Object {Copy-Item -Path $_.Fullname -Destination $dest -Force} 

शुभकामनाएँ!

26

यहां बताए गए प्रत्येक परिस्थिति को संभालने के लिए यहां कुछ विचार दिए गए हैं।

फ़ोल्डर संरचना केवल

यह एक गंतव्य के लिए स्रोत की प्रतिलिपि, उपनिर्देशिकाएं recursing लेकिन सभी फाइलों को छोड़कर होगा।

robocopy $source $dest /e /xf *.* 

फ़ाइलें केवल (संरचना फ़्लैट)

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

Get-ChildItem $source -Recurse | 
    Where-Object { $_.PSIsContainer -eq $true } | 
    Foreach-Object { robocopy $_.FullName $dest } 

सब कुछ

इस परिदृश्य गुच्छा का सबसे सरल है।

robocopy $source $dest /e 

आप स्विच खुद प्रक्रिया परिशोधित (रास्ते robocopy /? संदर्भित) के साथ प्रयोग कर सकते हैं। मेरी राय में सबसे कठिन परिदृश्य वह है जो निर्देशिका संरचना को फ़्लैट करता है। आपके पास कुछ निर्णय लेने होंगे, जैसे कि आप एक ही फ़ाइल नाम को एकाधिक निर्देशिकाओं में प्रदर्शित करना चाहते हैं।

कमांड लाइन से विकल्पों को स्वीकार करने के तरीके के रूप में, मैं सुझाव देता हूं कि आपके तीन स्थितियों के लिए पावरहेल पैरामीटर सेट्स को एकसाथ रखें। इस बारे में कई ब्लॉग पोस्ट हैं जो अवधारणा पर चर्चा करते हैं, लेकिन आप पावरहेल के अंदर TechNet देख सकते हैं या help about_Functions_Advanced_Parameters चला सकते हैं।

+0

सुझाव के लिए धन्यवाद के बिना। मेरे पास रोबोकॉपी भी स्थापित नहीं था, और यह काफी अच्छी तरह से आवश्यकताओं के अनुरूप है। मैं एक फ़ाइल में संरचना के लिए क्या कर रहा था, एक टेक्स्ट फ़ाइल में शो-ट्री पाइप करना था। इसने एक और टुकड़ा पूरा किया जो मैं बाद में था। कोई भी चीज यह सब नहीं करेगी, लेकिन 3 अपेक्षाकृत सीधा टुकड़े एक साथ मिलकर मुझे चाहिए। आपकी मदद के लिए धन्यवाद! –

+0

फ़्लैटन एक के लिए, आप मध्य भाग को छोड़ सकते हैं और गेट-चाइल्ड इटिम (और रोबोकॉपी के बजाय कॉपी-आइटम) पर -फाइल विकल्प का उपयोग कर सकते हैं: Get-ChildItem $ Source -Recurse -File | Foreach-Object {कॉपी-आइटम $ _। पूर्णनाम $ dest}। हालांकि एक बड़ा अंतर नहीं है। – Brandon

+1

@ ब्रैंडन अच्छा बिंदु। जब तक आप पावरहेल 3 पर हों, तब तक आप निश्चित रूप से ऐसा कर सकते हैं ('-फाइल' और '-डायरेक्टरी' पैरामीटर v3 तक मौजूद नहीं थे)। – ajk

1

निम्नलिखित प्रतियां TestData करने के लिए सिर्फ फ़ोल्डर संरचना प्रपत्र ProdData किसी भी फाइल

$from = "C:\ProdData" 
 
$to = "C:\TestData" 
 

 
Get-ChildItem -Path $from -Recurse | 
 
?{ $_.PSIsContainer } | 
 
Copy-Item -Destination {Join-Path $to $_.Parent.FullName.Substring($from.length)} -Force

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

  • कोई संबंधित समस्या नहीं^_^