2012-06-13 14 views
23

का उपयोग कर विंडोज में एक ज़िप/संपीड़ित फ़ोल्डर बनाना, मैं रात की डेटाबेस स्कीमा फ़ाइल बना रहा हूं और प्रत्येक डेटाबेस के लिए प्रत्येक फाइल को एक फ़ोल्डर में रखना चाहता हूं, एक फ़ोल्डर में और उस फ़ोल्डर को संपीड़ित करना चाहता हूं। मेरे पास एक PowerShell स्क्रिप्ट है जो स्कीमा बनाता है। केवल डीबी की सृजन स्क्रिप्ट और फिर सभी फ़ाइलों को एक नए फ़ोल्डर में जोड़ती है। समस्या इस प्रक्रिया के संपीड़न भाग के भीतर है।पावरहेल या कमांड लाइन

क्या किसी को कोई विचार है अगर यह पूर्व-स्थापित विंडोज उपयोगिता के साथ पूरा किया जा सकता है जो फ़ोल्डर संपीड़न को संभालता है?

7zip (मुझे हर ग्राहक के सर्वर पर 7zip इंस्टॉल करने की तरह महसूस नहीं होता है) के मुकाबले उस उपयोगिता का उपयोग करना सबसे अच्छा होगा और अगर मैं उनसे पूछूं तो इसे करने में आईटी साल लग सकते हैं)।

+0

मुझे लगता है कि यह आपके विकल्पों को बताता है: http://richardspowershellblog.wordpress.com/2007/06/02/powershell-and-compressed-files/ – David

+1

बहुत बहुत धन्यवाद! यह एक साफ और आसान समाधान था। किसी और के लिए निर्देश जो इस धागे पर ठोकर खा सकते हैं। PowerShell समुदाय एक्सटेंशन से डाउनलोड करें: http://pscx.codeplex.com/downloads फ़ाइलों को निकालें, फिर निर्देशिका को स्थानांतरित करें: सी: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ मॉड्यूल। फिर आदेश चलाकर मॉड्यूल आयात: आयात-मॉड्यूल Pscx – TechDawg270

उत्तर

19

यहां कुछ ज़िप-संबंधित फ़ंक्शंस हैं जो एक्सटेंशन पर भरोसा नहीं करते हैं: Compress Files with Windows PowerShell

मुख्य कार्य है कि आप की संभावना में रुचि होगी है:

function Add-Zip 
{ 
    param([string]$zipfilename) 

    if(-not (test-path($zipfilename))) 
    { 
     set-content $zipfilename ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18)) 
     (dir $zipfilename).IsReadOnly = $false 
    } 

    $shellApplication = new-object -com shell.application 
    $zipPackage = $shellApplication.NameSpace($zipfilename) 

    foreach($file in $input) 
    { 
      $zipPackage.CopyHere($file.FullName) 
      Start-sleep -milliseconds 500 
    } 
} 

उपयोग:

dir c:\demo\files\*.* -Recurse | Add-Zip c:\demo\myzip.zip 

वहाँ एक चेतावनी है: shell.application वस्तु की NameSpace() समारोह ज़िप फ़ाइल को खोलने के लिए विफल रहता है लिखने के लिए यदि पथ पूर्ण नहीं है। इसलिए, यदि आपने Add-Zip पर एक सापेक्ष पथ पारित किया है, तो यह शून्य त्रुटि के साथ विफल हो जाएगा, इसलिए ज़िप फ़ाइल का पथ पूर्ण होना चाहिए।

या आप फ़ंक्शन की शुरुआत में केवल $zipfilename = resolve-path $zipfilename जोड़ सकते हैं।

+0

यह काम किया है और मैं समय पर प्रतिक्रिया की सराहना करते हैं, लेकिन मैं डाउनलोड करने और PowerShell समुदाय एक्सटेंशन स्थापित और राइट-पिन commandlet की उपलब्धता होने लगता है एक क्लीनर/आसान है कार्यक्षमता प्राप्त करने की विधि। – TechDawg270

+0

@ टेकडॉव 270: सहमत - मैं ज्यादातर इसे पूर्णता के लिए पोस्ट करता हूं। – voithos

3

यह करने के लिए संपीड़ित करता है। \ सामग्री में। \ Out.zip System.IO.Packaging.ZipPackage साथ उदाहरण निम्नलिखित here

$zipArchive = $pwd.path + "\out.zip" 
[System.Reflection.Assembly]::Load("WindowsBase,Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35") 
$ZipPackage=[System.IO.Packaging.ZipPackage]::Open($zipArchive, [System.IO.FileMode]"OpenOrCreate", [System.IO.FileAccess]"ReadWrite") 
$in = gci .\in | select -expand fullName 
[array]$files = $in -replace "C:","" -replace "\\","/" 
ForEach ($file In $files) { 
    $partName=New-Object System.Uri($file, [System.UriKind]"Relative") 
    $part=$ZipPackage.CreatePart($partName, "application/zip", [System.IO.Packaging.CompressionOption]"Maximum") 
    $bytes=[System.IO.File]::ReadAllBytes($file) 
    $stream=$part.GetStream() 
    $stream.Write($bytes, 0, $bytes.Length) 
    $stream.Close() 
                } 
$ZipPackage.Close() 
1

अप powershell में ज़िप फ़ाइलों को voithos 'जवाब प्रयुक्त, सिर्फ एक समस्या थी ऐड-ज़िप फ़ंक्शन के साथ, स्टार्ट-नींद-मिलिसेकंड 500 ने समस्याएं उत्पन्न कीं अगर उस समय फ़ाइल को पूरी तरह से ज़िप नहीं किया जा सका -> अगला पूरा होने से पहले शुरू होने वाली त्रुटियों और कुछ फ़ाइलों को ज़िपित नहीं किया जाना चाहिए।

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

function Add-Zip 
{ 
param([string]$zipfilename) 

if(-not (test-path($zipfilename))) 
{ 
    set-content $zipfilename ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18)) 
    (dir $zipfilename).IsReadOnly = $false 
} 

$shellApplication = new-object -com shell.application 
$zipPackage = $shellApplication.NameSpace($zipfilename) 

foreach($file in $input) 
{ 
     $zipPackage.CopyHere($file.FullName) 
     do 
     { 
      Start-sleep -milliseconds 250 
     } 
     while ($zipPackage.Items().count -eq 0) 
} 
} 
-3

PowerShell संस्करण 3.0 का उपयोग करना:

Copy-ToZip -File ".\blah" -ZipFile ".\blah.zip" -Force 

आशा इस मदद करता है।

+4

यह पावरशेल 3 सेमीडलेट नहीं है। –

21

नवीनतम .NET 4 के साथ एक मूल तरीका।5 ढांचा है, लेकिन पूरी तरह से सुविधा कम:

निर्माण:

Add-Type -Assembly "System.IO.Compression.FileSystem" ; 
[System.IO.Compression.ZipFile]::CreateFromDirectory("c:\your\directory\to\compress", "yourfile.zip") ; 

निष्कर्षण:

Add-Type -Assembly "System.IO.Compression.FileSystem" ; 
[System.IO.Compression.ZipFile]::ExtractToDirectory("yourfile.zip", "c:\your\destination") ; 

के रूप में उल्लेख किया है, पूरी तरह से सुविधा कम है, इसलिए उम्मीद नहीं है एक के ऊपर लिख झंडा।

+1

यह सुरुचिपूर्ण है। एक वोट दें है .. – deepelement

+0

मैं इस समाधान :(आप विचार है कि? – Jerome2606

+0

@ Jerome2606 लिए मजबूर करने के लिए है के साथ से इनकार पहुंच पथ हो गया ... तो अपना रास्ता सुलभ बनाने के। इसके अलावा, के रूप में उल्लेख – sonjz

4

PowersShell 5 के रूप में एक Compress-Archive cmdlet कि बॉक्स से बाहर काम करता है नहीं है।