PowerShell ile zip arşivi nasıl oluşturulur?


Yanıtlar:


124

CodePlex'e gidip PowerShell Topluluk Uzantılarını alırsanız, write-zipcmdlet'lerini kullanabilirsiniz .

Dan beri

CodePlex kapatma hazırlığında salt okunur modda

PowerShell Galerisi'ne gidebilirsiniz .


114
Evet ve sıkıştırma cmdlet'lerinin çoğu için çekirdek kitaplık olarak 7z kullanır. Biliyorum, uyguladığım için becaues;) +1
x0n

1
lol iyi iş, x0n. PSCX'deki yem deposu sağlayıcısını belirledim. Biraz daha az pratik ama tonlarca eğlence. :)
Matt Hamilton

1
7z kullanıyorsa, şifre kullanarak zip yapmak mümkün mü?
mack

1
@SemiDementedwrite-zip [input file/folder] [output file]
joshschreuder


255

PowerShell 3 ve .NET 4.5 ile çalışan saf bir PowerShell alternatifi (eğer kullanabiliyorsanız):

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)
}

Oluşturmak istediğiniz zip arşivinin tam yolunu ve sıkıştırmak istediğiniz dosyaları içeren dizinin tam yolunu girmeniz yeterlidir.


1
Bunun gerçekten Powershell 3.0 veya sadece .net 4.5'e ihtiyacı var mı? Sadece .net programlama olmak yerine, gerçek powershell özelliklerine çok hafif görünüyor.
bwerks

@bwerks 'düzenle' kısmını bakınız burada
noam

Sadece tek bir büyük dosyayı sıkıştırmanın bir yolunu arıyordum, ama görünüşe göre bunun için bir yöntem yok. Yeni bir dizin oluşturacak kod yazmak zorunda kaldım, tek dosyayı oraya kopyalayın, o dizini yeni bir zip dosyasına sıkıştırın, ardından temizlemek için dizini silin.
Baodad

1
@Baodad, cevabımı gör.
Dherik

Tam yola ihtiyacım olduğunu okumalıydım. Kafa karıştırıcı bir çocuk! BTW bu kabul edilmiş cevap olmalı
Kolob Kanyonu

244

PowerShell v5.0 ekler Compress-Archiveve Expand-Archivecmdlet'ler. Bağlantı verilen sayfaların tam örnekleri vardır, ancak özeti şöyledir:

# 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 resmi olarak piyasaya çıktı. Ayrıca Windows 10 ile birlikte geliyor.
Ohad Schneider


2
Compress-ArchiveAçıklama: " Paragraf 2'den : ... ... Sıkıştır-Arşivle kullanarak sıkıştırabileceğiniz maksimum dosya boyutu şu anda 2 GB'dir. Bu, temel API'nın bir System.IO.Compression.ZipFilesınırlamasıdır."
AMissico

2
2GB sınırı devralındı System.IO.Compression.ZipFile. Kullandığınız .NET çerçevesi bu sınıra sahip değilse, CmdLet bu sınıra ulaşmamalıdır. Kodda doğruladım.
TravisEz13

2
@Pramod'da -OutputPathparametre yok .
BrainSlugs83

57

En son .NET 4.5 çerçevesine sahip, ancak tamamen özelliksiz yerel bir yol:

Oluşturma:

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

Çıkarma:

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

Belirtildiği gibi, tamamen özelliksiz, bu yüzden üzerine yazma bayrağı beklemeyin .

GÜNCELLEME: Yıllar boyunca bu konuyu genişleten diğer geliştiriciler için aşağıya bakın ...


Özelliksiz yöntemi neden kullanasınız?
Pluto

Bu, gönderilen tarih ve emsal sırasına göre kabul edilen cevap olmalıdır. Güncellenmiş yorumunuza gelince, bunu gerçekten yapmanın çok sayıda yolu var. Bu işlevselliğe ihtiyaç duyuyorum ve PowerShell 4'dayım, bulduğum ilk şey yerel yol. 2009 yılında bu iyi bir soruydu. Sanırım ilk sorulduğunda soruda daha fazla araştırma yapılabilirdi.
DtechNet

45

7zip'i yükleyin (veya bunun yerine komut satırı sürümünü indirin) ve bu PowerShell yöntemini kullanın:

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

Bu şekilde arayabilirsiniz:

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

6
7zip yolunuzdaysa, yazmanız gereken tek şey "& 7z c: \ temp \ myFolder c: \ temp \ myFolder.zip"
aboy021 24:13

5
Yüklemek istemiyorsanız, bunun yerine komut satırı sürümünü indirebilirsiniz. (Sadece 7-zip'in İndirme sayfasına bakın.) Bu sadece bir çalıştırılabilir ve komut sözdizimi aynıdır. Yürütülebilir dosya farklı bir ad olsa da; nedense 7za.exe. Bunu bir dizi projede yaptım ve hiç hayal kırıklığına uğratmadım.
jpmc26

.Net ve Powershell araçlarıyla hemen çalıştığım 7zip yoluna kadar çok uzun bir süre denedim. $ Dosyasındaki basit foreach döngüsü hile yapıyor& "C:\Program Files\7-Zip\7z.exe" a -tzip ($file.FullName+".zip") $file.FullName
SebK

17

İlk cevap gönderildikten sonra lot değişti. Sıkıştır-Arşivle komutunu kullanan en son örneklerden bazıları aşağıda verilmiştir .

Komut, yeni arşiv dosyası oluşturmak için Draft.zipiki dosya sıkıştırarak, Draftdoc.docxve diagram2.vsdtarafından belirtilen, Pathparametre. Bu işlem için belirtilen sıkıştırma seviyesi Optimum'dur.

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

Komut, yeni arşiv dosyası oluşturur üzere Draft.zipiki dosya sıkıştırarak, Draft doc.docxve Diagram [2].vsdtarafından belirtilen, LiteralPathparametre. Bu işlem için belirtilen sıkıştırma seviyesi Optimum'dur.

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

Komut, yeni arşiv dosyası oluşturmak için Draft.zipde, C:\Archivesklasörün. Path parametresindeki belirli dosya adları yerine joker karakter kullanıldığından, yeni arşiv dosyası C: \ Reference klasöründeki her dosyayı içerir .

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

Command, tüm klasörden bir arşiv oluşturur, C:\Reference

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

PowerShell, .zipuzantıyı dosya adına otomatik olarak ekler .


15

İki tane düzenle - Bu kod eski günlerden çirkin, çirkin bir kluge. Onu istemezsin.

Bu içeriğini sıkıştırır .\iniçin .\out.zipörnek aşağıdaki System.IO.Packaging.ZipPackage ile burada

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

Düzenleme: Büyük dosyalar için güvenilmez , belki> 10mb, YMMV. Bir şey yapmak için AppDomain kanıt ve izole depolama. Dostça .NET 4.5 yaklaşımı PS v3'ten güzel çalışıyor, ancak benim durumumda daha fazla bellek istiyordu. PS v2'den .NET 4'ü kullanmak için yapılandırma dosyalarının desteklenmeyen bir ayar yapılması gerekiyor .


ZipPackage'ın en büyük sorunu normal ZIP dosyası değil, bir içerik xml dosyası içermesidir. bkz. [.net'in ZipPackage sınıfında [Content_Types] .xml nasıl önlenir - Yığın Taşması] ( stackoverflow.com/questions/3748970/… )
aaron

@aaron Bunu bir daha kullanmamak için bir harika sebep daha! Burada "büyük sorun" için sert bir rekabet var;)
noam

12

Başka bir seçeneğin altında. Bu, tam bir klasörü sıkıştırır ve arşivi belirtilen adla belirli bir yola yazar.

.NET 3 veya üstü gerektirir

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 kullanarak Compress-Archive Zip dosyaları oluşturma cmdlet'ini kullanarak PowerShell v5 için yerel bir çözüm .

Ayrıca bkz. Microsoft Sıkıştırılmış Arşiv için Dokümanlar .

Örnek 1:

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

Örnek 2:

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

Örnek 3:

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

7

Sıkıştırma için bir kütüphane kullanırdım (7-Zip, Michal'in önerdiği gibi iyidir ).

7-Zip'i yüklerseniz , yüklü dizin 7z.exebir konsol uygulaması olan içerir .
Doğrudan çağırabilir ve istediğiniz herhangi bir sıkıştırma seçeneğini kullanabilirsiniz.

DLL ile meşgul olmak istiyorsanız, bu da mümkün olmalıdır.
7-Zip ücretsiz ve açık kaynak kodludur.


2
Powershell'den AES şifrelemeli 7 zip kullanımına bir örnek: codeblog.theg2.net/2010/02/…
Greg Bray

7

Ne olmuş System.IO.Packaging.ZipPackage?

.NET 3.0 veya üstünü gerektirir.

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

ile Anders Hesselbom


5

Neden kimse belgelere bakmıyor? Bir var desteklenen yöntemBoş bir zip dosyası oluşturmanın ve herkesin başvurduğu aynı .NET 4.5 kütüphanesinde yerleşik dosyaları tek tek eklemenin .

Kod örneği için aşağıya bakın:

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

Ben tavsiye ederiz belgeleri taramak varsa herhangi bir sorunuz.


2
Bunun için teşekkür ederim, bu mükemmel. Özellikle kötü tasarlanmış ve fermuarın içindeki yolları belirtmek için iyi bir yolu olmayan Sıkıştır-Arşivle cmdlet'ine kıyasla.
Rafael Kitover

4

Bu gerçekten belirsiz ama işe yarıyor. 7za.exe , 7zip'in bağımsız bir sürümüdür ve yükleme paketiyle birlikte sunulur.

# 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

Birinin tek bir dosyayı sıkıştırması gerekiyorsa (bir klasörü değil): 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

Bu kod bir kabuk uygulamasına dayanır ve daha sonra bitmesini beklemek için 500 ms tahmin eder ... Çalıştığına katılmıyorum (çoğu durumda). Ancak, sıkıştırılmış bir dosya eklemenin biraz zaman aldığı (büyük dosyalar ekleyerek veya büyük fermuarlarla çalışarak kolayca çoğaltılabilir) her durumda kullandığınızda pop-up'lar oluşturur. Ayrıca, herhangi bir zip işlemi belirtilen uyku süresinden daha yavaşsa, dosya eklenemez ve bir açılır iletişim kutusunun arkasında bırakılmaz. Bu senaryo yazmak için korkunç. Ayrıca, bu tuzaklara değinmediği için COM nesnesine dayanan diğer cevabı da düşürdüm.
Pluto

4

İşte çalışma kodu, kaynak klasördeki tüm dosyaları zipleme ve hedef klasörde bir zip dosyası oluşturma.

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

Not:
ZipName : Oluşturmak istediğiniz Zip Dosyasının Tam Yolu.

SourceDirectory: Sıkıştırmak istediğiniz dosyaları içeren dizinin tam yolu.


3

İşte sonjz'ın cevabının biraz geliştirilmiş bir versiyonu, üzerine yazma seçeneği ekliyor.

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
Verdiğiniz çözüm hakkında biraz daha açıklama ekleyerek cevabınızı biraz daha açıklayabilir misiniz?
abarisone

Önceki bir cevabı aldım ve üzerine yazma seçeneği ekleyerek geliştirdim, söyleyecek çok şey yok!
Lou O.

3

Bu, geçici bir klasör kullanmadan ve bu StackOverflow yanıtından C # 'dan dönüştürülen yerel .Net 4.5 kullanmadan tek bir dosyayı sıkıştırmak için de çalışmalıdır . Bu alınan sözdizimini kullanarak bir daha güzel kullanır burada .

Kullanımı:

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

Kod:

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)
        }
    }
}

Kullanımı:

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

Mükemmel. O shell.applicationiş veya 7-Zip / diğer ayrı yardımcı programları kullanmadan bir dosya zip için bir yol arıyordu . Ben de Using-Objectolmadan daha kısa, hızlı n-kirli bir yaklaşım için gitti rağmen fonksiyonu da seviyorum .
Charlie Joynt

2

Bu snippet'i henüz sıkıştırılmamış yedekleme dosyaları için veritabanı yedeklerim klasörünü kontrol etmek, 7-Zip kullanarak sıkıştırmak ve son olarak *.bakbazı disk alanından tasarruf etmek için dosyaları silmek için kullanıyorum . Bazı dosyaların sıkıştırılmaması için bildirim dosyaları sıkıştırmadan önce uzunluğa (en küçükten büyüğe) sıralanır.

$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 }

Burada bu dosyaları FTP üzerinden yedeklemek, sıkıştırmak ve aktarmak için bir PowerShell betiğini kontrol edebilirsiniz .


2

WinRAR kurulu ise:

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;
}

Argümanların anlamı: afzip zip arşivi oluşturur, df dosyaları siler, ep1 arşiv içinde tam dizin yolu oluşturmaz


2

Burada cmd.exe veya ssh veya ne istediğiniz başlatmak için tam bir komut satırı örneği!

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');}"

Saygılarımızla


2

Yükleniyor [System.IO.IOException] sınıfı ve yöntemleri kullanarak, bastırmak istenmeyen hatalar için önemli bir adımdır o kadar onsuz hataların çeşitli bağlamları bekliyoruz PowerShell'e değil yerli bir sınıf olduğu gerçeği nedeniyle.

Komutumu T'ye hata kontrollü olarak kontrol ettim, ancak [System.IO.Compression.ZipFile]sınıf kullanırken çok fazla kırmızı 'dosya var' çıktısı aldım

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 
    }
} 

Burada yaptığım, zaten var olan dosyalara erişmek, bu hatayı yakalamak ve daha büyük bir programla sürdürdüğüm bir günlük dosyasına yönlendirmek gibi bu IO Hatalarını yakalamak.


2

Windows'ta Dizini Sıkıştırma ve Ayıklama için Komut Satırı Komutlarının Tamamı aşağıdaki gibidir:

  • Sıkıştırma için:

    powershell.exe -nologo -noprofile -command "& { Add-Type -A 'System.IO.Compression.FileSystem'; [IO.Compression.ZipFile]::CreateFromDirectory('C:\Indus','C:\Indus.zip'); }"
  • Ayıklamak için:

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


-4

Bu komut dosyası tüm dizinleri yineler ve her birini sıkıştırır

Get-ChildItem -Özellikler d | foreach {write-zip $ .Name "$ ($ .Name) .zip"}


1
Bunun 7 yaşındaki soru ile ilgili tek bölümü, 2009'da kabul edilen cevap olan "yazma-zip" idi.
reddedildi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.