PowerShell के साथ ज़िप संग्रह कैसे बनाएं?


जवाबों:


124

यदि आप CodePlex पर जाते हैं और PowerShell सामुदायिक एक्सटेंशन हड़पते हैं , तो आप उनके write-zipcmdlet का उपयोग कर सकते हैं ।

जबसे

कोडप्लैक्स शटडाउन की तैयारी में केवल पढ़ने के लिए मोड में है

आप PowerShell गैलरी में जा सकते हैं ।


114
हां, और यह अपने सम्पीडन cmdlets के अधिकांश के लिए मुख्य पुस्तकालय के रूप में 7z का उपयोग करता है। मुझे पता है, क्योंकि मैंने इसे लागू किया;) +1
x0n

1
योग्य अच्छा काम, x0n मैंने PSCX में फीड स्टोर प्रोवाइडर की नकल की। थोड़ा कम व्यावहारिक लेकिन टन मज़ा। :)
मैट हैमिल्टन

1
यदि यह 7z का उपयोग करता है, तो क्या पासवर्ड का उपयोग करके ज़िप करना संभव है?
एमएसी

1
@ सेमिडेटेडwrite-zip [input file/folder] [output file]
जोशचेरुडर 22

9
पॉवर्सशेल 5 एक कॉम्प्रेस-आर्काइव cmdlets के साथ आता है जो .zip blogs.technet.microsoft.com/heyscriptingguy/2015/08/13/…
Benoit Patra

255

एक शुद्ध PowerShell विकल्प जो PowerShell 3 और .NET 4.5 के साथ काम करता है (यदि आप इसका उपयोग कर सकते हैं):

function ZipFiles( $zipfilename, $sourcedir )
{
   Add-Type -Assembly System.IO.Compression.FileSystem
   $compressionLevel = [System.IO.Compression.CompressionLevel]::Optimal
   [System.IO.Compression.ZipFile]::CreateFromDirectory($sourcedir,
        $zipfilename, $compressionLevel, $false)
}

आप जिस जिप आर्काइव को बनाना चाहते हैं, उसके लिए पूरे रास्ते को पास करें और निर्देशिका का पूरा रास्ता उन फाइलों से युक्त करें जिन्हें आप ज़िप करना चाहते हैं।


1
क्या यह वास्तव में पॉवर्सशेल 3.0, या सिर्फ .net 4.5 की आवश्यकता है? वास्तविक। पर बहुत हल्का लगता है मेरे लिए सुविधाएँ, बजाय सिर्फ .net प्रोग्रामिंग।
बर्कक्स

@bwerks यहां
noam

मैं एक एकल बड़ी फ़ाइल को संपीड़ित करने का एक तरीका ढूंढ रहा था, लेकिन जाहिर है कि इसके लिए कोई विधि नहीं है। मुझे कोड लिखना था जो एक नई निर्देशिका बनाएगा, वहां एकल फ़ाइल की प्रतिलिपि बनाएँ, उस निर्देशिका को एक नई ज़िप फ़ाइल में संपीड़ित करें, फिर साफ़ करने के लिए निर्देशिका को हटा दें।
बोडाद

1
@ बाओदाद, मेरा जवाब देखिए।
धेरिक

पढ़ना चाहिए था कि मुझे पूरा रास्ता चाहिए था। लड़का जो भ्रामक था! BTW यह स्वीकृत उत्तर होना चाहिए
कोलोब कैन्यन

244

PowerShell v5.0 जोड़ता है Compress-Archiveऔर Expand-Archivecmdlets। लिंक किए गए पृष्ठों के पूर्ण उदाहरण हैं, लेकिन इसका सार यह है:

# Create a zip file with the contents of C:\Stuff\
Compress-Archive -Path C:\Stuff -DestinationPath archive.zip

# Add more files to the zip file
# (Existing files in the zip file with the same name are replaced)
Compress-Archive -Path C:\OtherStuff\*.txt -Update -DestinationPath archive.zip

# Extract the zip file to C:\Destination\
Expand-Archive -Path archive.zip -DestinationPath C:\Destination

11
PowerShell v5.0 आधिकारिक तौर पर अब जारी किया गया है। यह विंडोज 10 के साथ भी आता है
Ohad Schneider


2
Compress-Archiveविवरण के पैराग्राफ 2 से : "... कंप्रेस-आर्काइव का उपयोग करके आप जिस अधिकतम फ़ाइल आकार को संपीड़ित कर सकते हैं, वह वर्तमान में 2 जीबी है। यह अंतर्निहित API की एक सीमा है" हालांकि, यदि आप उपयोग System.IO.Compression.ZipFileकरते हैं तो आप इस सीमा को बायपास कर सकते हैं।
1

2
2GB की सीमा से विरासत में मिली थी System.IO.Compression.ZipFile। यदि आपके द्वारा उपयोग किए जा रहे .NET फ्रेमवर्क में यह सीमा नहीं है, तो CmdLet को यह सीमा नहीं मारनी चाहिए। मैंने कोड में सत्यापित किया।
ट्रैविज़ेज़ 13

2
@Pramod का कोई -OutputPathपैरामीटर नहीं है।
BrainSlugs83

57

नवीनतम .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") ;

जैसा कि उल्लेख किया गया है, पूरी तरह से फीचर-कम है, इसलिए एक अधिलेखित ध्वज की अपेक्षा न करें ।

अद्यतन: अन्य डेवलपर्स के लिए नीचे देखें कि इस पर वर्षों से विस्तार किया है ...


आप फीचर रहित पद्धति का उपयोग क्यों करेंगे?
प्लूटो

पोस्ट और मिसाल के क्रम में यह स्वीकृत उत्तर होना चाहिए। आपकी अपडेट की गई टिप्पणी के अनुसार - ऐसा करने के लिए वास्तव में बहुत बड़ी संख्या है। मुझे इस कार्यक्षमता की आवश्यकता का सामना करना पड़ रहा है और मैं PowerShell 4 पर हूं, पहली चीज जो मुझे मिली है वह है देशी तरीका। 2009 में यह एक अच्छा प्रश्न था। मुझे अभी भी लगता है कि मूल रूप से पूछे जाने पर प्रश्न में और अधिक शोध प्रस्तुत किया जा सकता था।
DtechNet

45

7zip स्थापित करें (या इसके बजाय कमांड लाइन संस्करण डाउनलोड करें) और इस PowerShell विधि का उपयोग करें:

function create-7zip([String] $aDirectory, [String] $aZipfile){
    [string]$pathToZipExe = "$($Env:ProgramFiles)\7-Zip\7z.exe";
    [Array]$arguments = "a", "-tzip", "$aZipfile", "$aDirectory", "-r";
    & $pathToZipExe $arguments;
}

आप इसे इस तरह से कॉल कर सकते हैं:

create-7zip "c:\temp\myFolder" "c:\temp\myFolder.zip"

6
अगर 7zip आपके रास्ते में है, तो आपको बस इतना लिखना होगा "& 7z c: \ temp \ myFolder c: \ temp \ myFolder.zip"
aboy021

5
यदि आप इसे स्थापित नहीं करना चाहते हैं, तो आप इसके बजाय कमांड लाइन संस्करण डाउनलोड कर सकते हैं। (बस 7-ज़िप के डाउनलोड पृष्ठ पर देखें।) यह सिर्फ एक निष्पादन योग्य है, और कमांड सिंटैक्स समान है। निष्पादन योग्य एक अलग नाम है, हालांकि; यह किसी कारण के लिए 7za.exe है। मैंने कई परियोजनाओं पर यह किया है और कभी निराश नहीं हुआ।
jpmc26

मैंने 7zip पथ पर जाने के लिए .net और पॉवर्सशेल टूल के साथ बहुत लंबे समय तक प्रयास किया, जो तुरंत काम करता था। $ फ़ाइल पर साधारण & "C:\Program Files\7-Zip\7z.exe" a -tzip ($file.FullName+".zip") $file.FullName
फ़ॉरवर्ड

17

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

कमान नया संग्रह फ़ाइल बनाने के लिए, Draft.zipदो फ़ाइलों को संपीड़ित करके, Draftdoc.docxऔर diagram2.vsd, द्वारा निर्दिष्ट Pathपैरामीटर। इस ऑपरेशन के लिए निर्दिष्ट संपीड़न स्तर इष्टतम है।

Compress-Archive -Path C:\Reference\Draftdoc.docx, C:\Reference\Images\diagram2.vsd -CompressionLevel Optimal -DestinationPath C:\Archives\Draft.Zip

कमान नई संग्रह फ़ाइल बनाता है, Draft.zipदो फ़ाइलों को संपीड़ित करके, Draft doc.docxऔर Diagram [2].vsd, द्वारा निर्दिष्ट LiteralPathपैरामीटर। इस ऑपरेशन के लिए निर्दिष्ट संपीड़न स्तर इष्टतम है।

Compress-Archive -LiteralPath 'C:\Reference\Draft Doc.docx', 'C:\Reference\Images\Diagram [2].vsd'  -CompressionLevel Optimal -DestinationPath C:\Archives\Draft.Zip

फ़ोल्डर Draft.zipमें नई संग्रह फ़ाइल बनाने के लिए कमांड C:\Archives। नई संग्रह फ़ाइल में C: \ Reference फ़ोल्डर में प्रत्येक फ़ाइल है , क्योंकि पथ पैरामीटर में विशिष्ट फ़ाइल नामों के स्थान पर वाइल्डकार्ड वर्ण का उपयोग किया गया था ।

Compress-Archive -Path C:\Reference\* -CompressionLevel Fastest -DestinationPath C:\Archives\Draft

कमांड पूरे फ़ोल्डर से एक आर्काइव बनाता है, C:\Reference

Compress-Archive -Path C:\Reference -DestinationPath C:\Archives\Draft

PowerShell .zipफ़ाइल नाम में एक्सटेंशन को स्वचालित रूप से जोड़ता है ।


15

दो संपादित करें - यह कोड पुराने दिनों से एक बदसूरत, बदसूरत kluge है। तुम्हे यह नहीं चाहिए।

इस की सामग्री को संपीड़ित करता है .\inकरने के लिए .\out.zipSystem.IO.Packaging.ZipPackage साथ उदाहरण निम्नलिखित यहां

$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()

संपादित करें: बड़ी फ़ाइलों के लिए अविश्वसनीय , शायद> 10mb, YMMV। Appdomain सबूत और अलग भंडारण के साथ कुछ करना है । मित्रवत .NET .NET दृष्टिकोण PS v3 से अच्छी तरह से काम करता है, लेकिन मेरे मामले में अधिक मेमोरी चाहता था। PS v2 से .NET 4 का उपयोग करने के लिए, कॉन्फ़िगर फ़ाइलों को एक असमर्थित ट्वीक की आवश्यकता होती है ।


ZipPackage की प्रमुख समस्या यह सामान्य ज़िप फ़ाइल नहीं है, लेकिन इसमें एक सामग्री xml फ़ाइल है। देखें: [कैसे [Content_Types] से बचने के लिए .xml .net की ज़िपपैकेज क्लास - स्टैक ओवरफ़्लो] ( stackoverflow.com/questions/3748970/… )
aaron

@ हारून इसका एक और बड़ा कारण है इसका दोबारा इस्तेमाल न करना! आपको यहां "प्रमुख समस्या" के लिए कड़ी प्रतिस्पर्धा मिली है;)
नोम

12

एक अन्य विकल्प नीचे दे रहा है। यह एक पूर्ण फ़ोल्डर को ज़िप करेगा और दिए गए नाम के साथ संग्रह को दिए गए पथ पर लिख देगा।

.NET 3 या इसके बाद के संस्करण की आवश्यकता है

Add-Type -assembly "system.io.compression.filesystem"

$source = 'Source path here'    
$destination = "c:\output\dummy.zip"

If(Test-path $destination) {Remove-item $destination}

[io.compression.zipfile]::CreateFromDirectory($Source, $destination)

10

यहाँ PowerShell v5 के लिए एक देशी समाधान है, जो PowerShell का उपयोग करके cmdlet Compress-Archive Create Zip फ़ाइलों का उपयोग कर रहा है

कंप्रेस-आर्काइव के लिए Microsoft डॉक्स भी देखें ।

उदाहरण 1:

Compress-Archive `
    -LiteralPath C:\Reference\Draftdoc.docx, C:\Reference\Images\diagram2.vsd `
    -CompressionLevel Optimal `
    -DestinationPath C:\Archives\Draft.Zip

उदाहरण 2:

Compress-Archive `
    -Path C:\Reference\* `
    -CompressionLevel Fastest `
    -DestinationPath C:\Archives\Draft

उदाहरण 3:

Write-Output $files | Compress-Archive -DestinationPath $outzipfile

7

संपीड़न के लिए, मैं एक पुस्तकालय का उपयोग करूंगा (7-ज़िप अच्छा है जैसे कि माइकल सुझाव देते हैं )।

यदि आप 7-ज़िप स्थापित करते हैं, तो स्थापित निर्देशिका 7z.exeमें एक कंसोल एप्लिकेशन होगा।
आप इसे सीधे लागू कर सकते हैं और अपने इच्छित किसी भी संपीड़न विकल्प का उपयोग कर सकते हैं।

यदि आप DLL से जुड़ना चाहते हैं, तो यह भी संभव होना चाहिए।
7-ज़िप फ्रीवेयर और ओपन सोर्स है।


2
यहाँ Powershell से एईएस एन्क्रिप्शन के साथ 7 ज़िप का उपयोग करने का एक उदाहरण है: codeblog.theg2.net/2010/02/…
ग्रेग ब्रे

7

किस बारे में System.IO.Packaging.ZipPackage?

इसके लिए .NET 3.0 या अधिक की आवश्यकता होगी।

#Load some assemblys. (No line break!)
[System.Reflection.Assembly]::Load("WindowsBase, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35")

#Create a zip file named "MyZipFile.zip". (No line break!)
$ZipPackage=[System.IO.Packaging.ZipPackage]::Open("C:\MyZipFile.zip",
   [System.IO.FileMode]"OpenOrCreate", [System.IO.FileAccess]"ReadWrite")

#The files I want to add to my archive:
$files = @("/Penguins.jpg", "/Lighthouse.jpg")

#For each file you want to add, we must extract the bytes
#and add them to a part of the zip file.
ForEach ($file In $files)
{
   $partName=New-Object System.Uri($file, [System.UriKind]"Relative")
   #Create each part. (No line break!)
   $part=$ZipPackage.CreatePart($partName, "",
      [System.IO.Packaging.CompressionOption]"Maximum")
   $bytes=[System.IO.File]::ReadAllBytes($file)
   $stream=$part.GetStream()
   $stream.Write($bytes, 0, $bytes.Length)
   $stream.Close()
}

#Close the package when we're done.
$ZipPackage.Close()

एंडर्स हेसेलबॉम के माध्यम से


5

डॉक्यूमेंटेशन को कोई देखता क्यों नहीं ?? एक खाली ज़िप फ़ाइल बनाने और उसी में निर्मित व्यक्तिगत फ़ाइलों को जोड़ने का एक समर्थित तरीका है । .NET 4.5 सभी को संदर्भित कर रहा है।

एक कोड उदाहरण के लिए नीचे देखें:

# Load the .NET assembly
Add-Type -Assembly 'System.IO.Compression.FileSystem'

# Must be used for relative file locations with .NET functions instead of Set-Location:
[System.IO.Directory]::SetCurrentDirectory('.\Desktop')

# Create the zip file and open it:
$z = [System.IO.Compression.ZipFile]::Open('z.zip', [System.IO.Compression.ZipArchiveMode]::Create)

# Add a compressed file to the zip file:
[System.IO.Compression.ZipFileExtensions]::CreateEntryFromFile($z, 't.txt', 't.txt')

# Close the file
$z.Dispose()

यदि आप कोई प्रश्न पूछना चाहते हैं तो मैं आपको दस्तावेज़ ब्राउज़ करने के लिए प्रोत्साहित करता हूँ ।


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

4

यह वास्तव में अस्पष्ट है लेकिन काम करता है। 7za.exe 7zip का स्टैंडअलोन संस्करण है और इंस्टॉल पैकेज के साथ उपलब्ध है।

# get files to be send
$logFiles = Get-ChildItem C:\Logging\*.* -Include *.log | where {$_.Name -match $yesterday} 

foreach ($logFile in $logFiles)
{
    Write-Host ("Processing " + $logFile.FullName)

    # compress file
    & ./7za.exe a -mmt=off ($logFile.FullName + ".7z") $logFile.FullName

}

4

अगर किसी को एक फ़ाइल (और एक फ़ोल्डर नहीं) को ज़िप करने की आवश्यकता है: http://blogs.msdn.com/b/jerrydixon/archive/2014/08/08/zipping-a-single-file-with-powershell.aspx

[CmdletBinding()]
Param(
     [Parameter(Mandatory=$True)]
     [ValidateScript({Test-Path -Path $_ -PathType Leaf})]
     [string]$sourceFile,

     [Parameter(Mandatory=$True)]
     [ValidateScript({-not(Test-Path -Path $_ -PathType Leaf)})]
     [string]$destinationFile
) 

<#
     .SYNOPSIS
     Creates a ZIP file that contains the specified innput file.

     .EXAMPLE
     FileZipper -sourceFile c:\test\inputfile.txt 
                -destinationFile c:\test\outputFile.zip
#> 

function New-Zip
{
     param([string]$zipfilename)
     set-content $zipfilename 
          ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18))
     (dir $zipfilename).IsReadOnly = $false
}

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 $sourceFile | Add-Zip $destinationFile

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

4

यहां वर्किंग कोड है, सोर्स फोल्डर से सभी फाइल्स को जिप करके डेस्टिनेशन फोल्डर में जिप फाइल बनाएं।

    $DestZip="C:\Destination\"
    $Source = "C:\Source\"

    $folder = Get-Item -Path $Source

    $ZipTimestamp = Get-Date -format yyyyMMdd-HHmmss;
    $ZipFileName  = $DestZip + "Backup_" + $folder.name + "_" + $ZipTimestamp + ".zip" 

    $Source

    set-content $ZipFileName ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18)) 
    # Wait for the zip file to be created.
    while (!(Test-Path -PathType leaf -Path $ZipFileName))
    {    
        Start-Sleep -Milliseconds 20
    } 
    $ZipFile = (new-object -com shell.application).NameSpace($ZipFileName)

    Write-Output (">> Waiting Compression : " + $ZipFileName)       

    #BACKUP - COPY
    $ZipFile.CopyHere($Source) 

    $ZipFileName
    # ARCHIVE

    Read-Host "Please Enter.."

4
function Zip-File
    {
    param (
    [string]$ZipName,
    [string]$SourceDirectory 

    )
       Add-Type -Assembly System.IO.Compression.FileSystem
       $Compress = [System.IO.Compression.CompressionLevel]::Optimal
       [System.IO.Compression.ZipFile]::CreateFromDirectory($SourceDirectory,
            $ZipName, $Compress, $false)
    }

नोट:
ज़िपनाम: जिप फाइल का पूर्ण पथ जिसे आप बनाना चाहते हैं।

SourceDirectory: डायरेक्टरी का पूरा रास्ता जिसमें वो फाइलें हैं जिन्हें आप ज़िप करना चाहेंगे।


3

यहां सोनज के उत्तर का थोड़ा सुधार हुआ संस्करण है, यह एक अधिलेखित विकल्प जोड़ता है।

function Zip-Files(
        [Parameter(Position=0, Mandatory=$true, ValueFromPipeline=$false)]
        [string] $zipfilename,
        [Parameter(Position=1, Mandatory=$true, ValueFromPipeline=$false)]
        [string] $sourcedir,
        [Parameter(Position=2, Mandatory=$false, ValueFromPipeline=$false)]
        [bool] $overwrite)

{
   Add-Type -Assembly System.IO.Compression.FileSystem
   $compressionLevel = [System.IO.Compression.CompressionLevel]::Optimal

    if ($overwrite -eq $true )
    {
        if (Test-Path $zipfilename)
        {
            Remove-Item $zipfilename
        }
    }

    [System.IO.Compression.ZipFile]::CreateFromDirectory($sourcedir, $zipfilename, $compressionLevel, $false)
}

2
क्या आप अपने समाधान के बारे में थोड़ा और विवरण जोड़कर अपने जवाब को विस्तृत कर सकते हैं?
अबरीसोन

मैंने एक पिछला उत्तर लिया और इसे ओवरराइट विकल्प में जोड़कर सुधार किया, कहने के लिए ज्यादा नहीं!
लू ओ।

3

यह भी एक अस्थायी फ़ोल्डर का उपयोग किए बिना एक फ़ाइल को संपीड़ित करने और देशी .Net 4.5 का उपयोग करने के लिए काम करना चाहिए, इस StackOverflow उत्तर से C # से परिवर्तित । यह यहाँ से लिए गए वाक्यविन्यास का उपयोग करते हुए एक अच्छाई का उपयोग करता है

उपयोग:

ZipFiles -zipFilename output.zip -sourceFile input.sql -filename name.inside.zip.sql

कोड:

function ZipFiles([string] $zipFilename, [string] $sourceFile, [string] $filename)
{
    $fullSourceFile = (Get-Item -Path "$sourceFile" -Verbose).FullName
    $fullZipFile = (Get-Item -Path "$zipFilename" -Verbose).FullName

    Add-Type -AssemblyName System.IO
    Add-Type -AssemblyName System.IO.Compression
    Add-Type -AssemblyName System.IO.Compression.FileSystem

    Using-Object ($fs = New-Object System.IO.FileStream($fullZipFile, [System.IO.FileMode]::Create)) {
         Using-Object ($arch = New-Object System.IO.Compression.ZipArchive($fs, [System.IO.Compression.ZipArchiveMode]::Create)) {
             [System.IO.Compression.ZipFileExtensions]::CreateEntryFromFile($arch, $fullSourceFile, $filename)
        }
    }
}

का उपयोग करते हुए:

function Using-Object
{
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true)]
        [AllowEmptyString()]
        [AllowEmptyCollection()]
        [AllowNull()]
        [Object]
        $InputObject,

        [Parameter(Mandatory = $true)]
        [scriptblock]
        $ScriptBlock
    )

    try
    {
        . $ScriptBlock
    }
    finally
    {
        if ($null -ne $InputObject -and $InputObject -is [System.IDisposable])
        {
            $InputObject.Dispose()
        }
    }
}

अति उत्कृष्ट। मैं उस shell.applicationव्यवसाय या 7-ज़िप / अन्य अलग-अलग उपयोगिताओं का उपयोग किए बिना एक फ़ाइल को ज़िप करने का एक तरीका ढूंढ रहा था । मुझे Using-Objectफंक्शन भी पसंद है, हालांकि मैं इसके बिना एक छोटे, त्वरित-एन-गंदे दृष्टिकोण के लिए गया था।
चार्ली जॉयंट

2

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

$bkdir = "E:\BackupsPWS"
$7Zip = 'C:\"Program Files"\7-Zip\7z.exe'

get-childitem -path $bkdir | Sort-Object length |
where
{
    $_.extension -match ".(bak)" -and
    -not (test-path ($_.fullname -replace "(bak)", "7z"))
} |
foreach
{
    $zipfilename = ($_.fullname -replace "bak", "7z")
    Invoke-Expression "$7Zip a $zipfilename $($_.FullName)"
}
get-childitem -path $bkdir |
where {
    $_.extension -match ".(bak)" -and
   (test-path ($_.fullname -replace "(bak)", "7z"))
} |
foreach { del $_.fullname }

यहाँ आप बैकअप के लिए उन फ़ाइलों को बैकअप करने, संपीड़ित करने और स्थानांतरित करने के लिए एक PowerShell स्क्रिप्ट की जांच कर सकते हैं ।


2

मामले में आप WinRAR स्थापित है:

function ZipUsingRar([String] $directory, [String] $zipFileName)
{
  Write-Output "Performing operation ""Zip File"" on Target ""Item: $directory Destination:"
  Write-Output ($zipFileName + """")
  $pathToWinRar = "c:\Program Files\WinRAR\WinRar.exe";
  [Array]$arguments = "a", "-afzip", "-df", "-ep1", "$zipFileName", "$directory";
  & $pathToWinRar $arguments;
}

तर्कों का अर्थ: afzip ज़िप आर्काइव बनाता है, df फ़ाइलों को हटाता है, ep1 संग्रह के भीतर पूर्ण निर्देशिका पथ नहीं बनाता है


2

यहाँ cmd.exe या ssh या जो आप चाहते हैं, से लॉन्च करने के लिए एक संपूर्ण कमांड लाइन उदाहरण है!

powershell.exe -nologo -noprofile -command "&{ Add-Type -A 'System.IO.Compression.FileSystem' [System.IO.Compression.ZipFile]::CreateFromDirectory('c:/path/to/source/folder/', 'c:/path/to/output/file.zip');}"

सादर


2

[System.IO.IOException]कक्षा को लोड करना और अपने तरीकों का उपयोग करना अवांछित त्रुटियों को दबाने के लिए एक महत्वपूर्ण कदम है, इस तथ्य के कारण कि यह पावरशेल के मूल निवासी नहीं है, इसलिए इसके बिना त्रुटियों के विभिन्न संदर्भों की अपेक्षा करें।

मैंने अपनी स्क्रिप्ट को T में त्रुटि-नियंत्रित किया, लेकिन [System.IO.Compression.ZipFile]कक्षा का उपयोग करते समय बहुत सारी अतिरिक्त लाल 'फ़ाइल मौजूद है' आउटपुट मिला

function zipFiles(
    [Parameter(Position=0, Mandatory=$true]
    [string] $sourceFolder,
    [Parameter(Position=1, Mandatory=$true]
    [string]$zipFileName,
    [Parameter(Position=2, Mandatory=$false]
    [bool]$overwrite)

{   
Add-Type -Assembly System.IO
Add-Type -Assembly System.IO.Compression.FileSystem

$compressionLevel = [System.IO.Compression.CompressionLevel]::Optimal

$directoryTest = (Test-Path $dailyBackupDestFolder)
$fileTest = (Test-Path $zipFileName)

if ( $directoryTest -eq $false) 
{ 
    New-Item -ItemType Directory -Force -Path $dailyBackupDestFolder 
}

     if ( $fileTest -eq $true)
     {
           if ($overwrite -eq $true ){Remove-Item $zipFileName}
     }   


    try
    {
         [System.IO.Compression.ZipFile]::CreateFromDirectory($sourceFolder,$zipFileName,$compressionLevel)       

    }
    catch [System.IO.IOException] 
    {
       Write-Output ($dateTime + ' | ' + $_.Exception.Message ) | Out-File $logFile -append -force 
    }
} 

मैं यहाँ क्या कर रहा हूँ इन IO त्रुटियों को पकड़ रहा हूँ, जैसे कि पहले से मौजूद फ़ाइलों को एक्सेस करना, उस त्रुटि को पकड़ना और इसे लॉगफ़ाइल में निर्देशित करना जो मैं एक बड़े कार्यक्रम के साथ बनाए रख रहा हूँ।


2

कंप्रेसिंग और एक्स्ट्रैक्टिंग डायरेक्टरी के लिए विंडोज में कमांड लाइन-कमांड पूरा होता है:

  • संपीड़न के लिए:

    powershell.exe -nologo -noprofile -command "& { Add-Type -A 'System.IO.Compression.FileSystem'; [IO.Compression.ZipFile]::CreateFromDirectory('C:\Indus','C:\Indus.zip'); }"
  • निकालने के लिए:

    powershell.exe -nologo -noprofile -command "& { Add-Type -A 'System.IO.Compression.FileSystem';[IO.Compression.ZipFile]::ExtractToDirectory('C:\Indus.zip','C:\Indus'); }"


-4

यह स्क्रिप्ट सभी निर्देशिकाओं को पुन: प्रसारित करती है और हर एक को ज़िप करती है

Get-ChildItem -Attributes d | foreach {लेखन-ज़िप $ .नाम "$ ($। नाम )। ज़िप"}


1
7 साल पुराने सवाल को यह प्रासंगिक का ही भाग था, "लिखने ज़िप" है, जो 2009 में स्वीकार किए जाते हैं जवाब था
अस्वीकृत
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.