Bagaimana cara membuat arsip zip dengan PowerShell?

244

Apakah mungkin membuat arsip zip menggunakan PowerShell?

Valentin Vasilyev
sumber
ada sampel dengan kode sumber lengkap?
Kiquenet

Jawaban:

124

Jika Anda menuju ke CodePlex dan ambil Ekstensi Komunitas PowerShell , Anda dapat menggunakan write-zipcmdlet mereka .

Sejak

CodePlex dalam mode read-only dalam persiapan untuk shutdown

Anda bisa pergi ke Galeri PowerShell .

Matt Hamilton
sumber
114
Yap, dan ia menggunakan 7z sebagai pustaka inti untuk sebagian besar cmdlet kompresinya. Saya tahu, karena saya menerapkannya;) +1
x0n
1
lol kerja bagus, x0n. Saya menerapkan penyedia toko umpan di PSCX. Agak kurang praktis tapi menyenangkan. :)
Matt Hamilton
1
Jika menggunakan 7z, apakah mungkin menggunakan zip dengan kata sandi?
mack
1
@SemiDementedwrite-zip [input file/folder] [output file]
joshschreuder
9
Powershell 5 hadir dengan cmdlet Compress-Archive yang menciptakan .zip blogs.technet.microsoft.com/heyscriptingguy/2015/08/13/…
Benoit Patra
255

Alternatif PowerShell murni yang bekerja dengan PowerShell 3 dan .NET 4.5 (jika Anda dapat menggunakannya):

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

Cukup lewati path lengkap ke arsip zip yang ingin Anda buat dan path lengkap ke direktori yang berisi file yang ingin Anda zip.

petrsnd
sumber
1
Apakah ini benar-benar membutuhkan Powershell 3.0, atau hanya .net 4.5? Tampak sangat ringan pada fitur PowerShell yang sebenarnya bagi saya, alih-alih hanya pemrograman .net.
bwerks
@bwerks lihat bagian 'edit' di sini
noam
Saya sedang mencari cara untuk hanya memampatkan satu file besar, tetapi ternyata tidak ada metode untuk ini. Saya harus menulis kode yang akan membuat direktori baru, salin satu file di sana, kompres direktori itu ke file zip baru, lalu hapus direktori untuk membersihkan.
Baodad
1
@ Baodad, lihat jawaban saya.
Dherik
Seharusnya membaca bahwa saya membutuhkan path lengkap. Bocah yang membingungkan! BTW ini seharusnya jawaban yang diterima
Kolob Canyon
244

PowerShell v5.0 menambahkan Compress-Archivedan Expand-Archivecmdlet. Halaman tertaut memiliki contoh lengkap, tetapi intinya adalah:

# 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
Brant Bobby
sumber
11
PowerShell v5.0 telah resmi dirilis sekarang. Itu juga dilengkapi dengan Windows 10.
Ohad Schneider
Sekarang tersedia di sini: microsoft.com/en-us/download/details.aspx?id=50395
starlocke
2
Dari Paragraf 2 Compress-ArchiveDeskripsi: "... ukuran file maksimum yang dapat Anda kompres dengan menggunakan Compress-Archive saat ini adalah 2 GB. Ini adalah batasan API yang mendasarinya" Namun, jika Anda menggunakan System.IO.Compression.ZipFileAnda dapat melewati batasan ini.
AMissico
2
Batas 2GB diwarisi dari System.IO.Compression.ZipFile. Jika .NET framework yang Anda gunakan tidak memiliki batas ini, CmdLet tidak boleh mencapai batas ini. Saya memverifikasi dalam kode.
TravisEz13
2
@Ramod tidak ada -OutputPathparameter.
BrainSlugs83
57

Cara asli dengan kerangka .NET 4.5 terbaru, tetapi sepenuhnya fitur-kurang:

Penciptaan:

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

Ekstraksi:

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

Seperti yang disebutkan, sama sekali tidak memiliki fitur, jadi jangan berharap bendera yang ditimpa .

UPDATE: Lihat di bawah ini untuk pengembang lain yang telah memperluas ini selama bertahun-tahun ...

sonjz
sumber
Mengapa Anda menggunakan metode tanpa fitur?
Pluto
Ini harus menjadi jawaban yang diterima sesuai urutan tanggal diposting dan preseden. Mengenai komentar Anda yang diperbarui - benar-benar ada sejumlah besar cara untuk melakukan ini sekarang. Saya dihadapkan dengan kebutuhan fungsi ini dan saya menggunakan PowerShell 4 hal pertama yang saya temukan adalah cara asli. Ini adalah pertanyaan yang bagus pada tahun 2009. Saya masih berpikir mungkin ada penelitian lebih lanjut yang disajikan dalam pertanyaan ketika awalnya diajukan.
DtechNet
45

Instal 7zip (atau unduh versi baris perintah) dan gunakan metode PowerShell ini:

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

Anda bisa menyebutnya seperti ini:

create-7zip "c:\temp\myFolder" "c:\temp\myFolder.zip"
Karl Glennon
sumber
6
Jika 7zip ada di jalur Anda, maka yang perlu Anda tulis adalah "& 7z c: \ temp \ myFolder c: \ temp \ myFolder.zip"
aboy021
5
Jika Anda tidak ingin menginstalnya, Anda dapat mengunduh versi baris perintah. (Lihat saja halaman Unduh 7-zip.) Itu hanya executable, dan sintaks perintahnya sama. Eksekusi adalah nama yang berbeda, meskipun; 7za.exe untuk beberapa alasan. Saya sudah melakukan ini pada sejumlah proyek dan tidak pernah kecewa.
jpmc26
Saya mencoba dengan alat .net dan Powershell terlalu lama sampai jalan 7zip yang bekerja segera. Simple foreach loop pada $ file melakukan trik& "C:\Program Files\7-Zip\7z.exe" a -tzip ($file.FullName+".zip") $file.FullName
SebK
17

Lot telah berubah sejak jawaban awal diposting. Berikut adalah beberapa contoh terbaru menggunakan perintah Compress-Archive .

Perintah untuk membuat file arsip baru Draft.zip,, dengan mengompresi dua file, Draftdoc.docxdan diagram2.vsd, ditentukan oleh Pathparameter. Level kompresi yang ditentukan untuk operasi ini adalah Optimal.

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

Perintah untuk membuat file arsip baru Draft.zip,, dengan mengompresi dua file, Draft doc.docxdan Diagram [2].vsd, ditentukan oleh LiteralPathparameter. Level kompresi yang ditentukan untuk operasi ini adalah Optimal.

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

Perintah untuk membuat file arsip baru Draft.zip,, di C:\Archivesfolder. File arsip baru berisi setiap file dalam folder C: \ Reference , karena karakter wildcard digunakan sebagai pengganti nama file tertentu dalam parameter Path .

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

Perintah menciptakan arsip dari seluruh folder, C:\Reference

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

PowerShell menambahkan .zipekstensi ke nama file secara otomatis.

Krishna Prasad Yalavarthi
sumber
15

Sunting dua - Kode ini jelek, kluge jelek dari masa lalu. Kamu tidak menginginkannya.

Ini kompres isi .\inuntuk .\out.zipdengan System.IO.Packaging.ZipPackage mengikuti contoh disini

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

Sunting: Tidak dapat diandalkan untuk file yang lebih besar, mungkin> 10MB, YMMV. Ada hubungannya dengan bukti appdomain dan penyimpanan terisolasi. The ramah NET 4.5 Pendekatan bekerja dengan baik dari PS v3, tetapi ingin lebih banyak memori dalam kasus saya. Untuk menggunakan .NET 4 dari PS v2, file config memerlukan tweak yang tidak didukung .

noam
sumber
masalah utama ZipPackage adalah bukan file ZIP yang normal , tetapi berisi file xml konten. lihat: [bagaimana cara menghindari [Content_Types] .xml di kelas ZipPackage .net - Stack Overflow] ( stackoverflow.com/questions/3748970/… )
aaron
@ Harun Satu lagi alasan bagus untuk tidak menggunakan ini lagi! Anda memiliki persaingan ketat untuk "masalah utama" di sini;)
noam
12

Di bawah ini memberi opsi lain. Ini akan membuka folder lengkap dan akan menulis arsip ke jalur yang diberikan dengan nama yang diberikan.

Membutuhkan .NET 3 atau lebih tinggi

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)
karthikeyan
sumber
10

Berikut ini adalah solusi asli untuk PowerShell v5, menggunakan cmdlet Compress-Archive Membuat file Zip menggunakan PowerShell .

Lihat juga Microsoft Documents untuk Compress-Archive .

Contoh 1:

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

Contoh 2:

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

Contoh 3:

Write-Output $files | Compress-Archive -DestinationPath $outzipfile
Harun
sumber
7

Untuk kompresi, saya akan menggunakan perpustakaan (7-Zip bagus seperti yang disarankan Michal ).

Jika Anda menginstal 7-Zip , direktori yang diinstal akan berisi 7z.exeaplikasi konsol.
Anda dapat memintanya secara langsung dan menggunakan opsi kompresi yang Anda inginkan.

Jika Anda ingin terlibat dengan DLL, itu juga harus dimungkinkan.
7-Zip adalah freeware dan open source.

nik
sumber
2
Berikut ini adalah contoh penggunaan 7 zip dengan enkripsi AES dari Powershell: codeblog.theg2.net/2010/02/…
Greg Bray
7

Bagaimana dengan System.IO.Packaging.ZipPackage?

Ini membutuhkan .NET 3.0 atau lebih tinggi.

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

melalui Anders Hesselbom

Peter P.
sumber
5

Mengapa tidak ada yang melihat dokumentasi ?? Ada metode yang didukung untuk membuat file zip kosong dan menambahkan file individual ke dalamnya dibangun di perpustakaan .NET 4.5 yang sama semua orang referensi.

Lihat di bawah untuk contoh kode:

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

Saya mendorong Anda untuk menelusuri dokumentasi jika Anda memiliki setiap pertanyaan.

Pluto
sumber
2
Terima kasih untuk ini, ini sempurna. Terutama dibandingkan dengan cmdlet Compress-Archive yang dirancang dengan buruk dan tidak memiliki cara yang baik untuk menentukan jalur di dalam zip.
Rafael Kitover
4

Ini benar-benar tidak jelas tetapi berfungsi. 7za.exe adalah versi mandiri 7zip dan tersedia dengan paket instal.

# 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

}
Michal Sznajder
sumber
4

Jika seseorang perlu menyalin satu file (dan bukan folder): 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
Dherik
sumber
Kode ini bergantung pada aplikasi shell dan kemudian menebak 500ms untuk menunggu sampai selesai ... Saya tidak setuju bahwa itu berfungsi (dalam kebanyakan kasus). Tapi itu menciptakan popup saat Anda menggunakannya dalam setiap kasus di mana menambahkan file terkompresi membutuhkan sejumlah waktu (mudah direproduksi dengan menambahkan file besar atau bekerja dengan ritsleting besar). Juga jika operasi zip lebih lambat dari waktu tidur apa pun yang ditentukan, itu akan gagal untuk menambahkan file dan meninggalkan kotak dialog sembulan. Ini mengerikan untuk skrip. Saya juga menurunkan suara jawaban lain yang bergantung pada objek COM karena tidak mengatasi perangkap ini.
Pluto
4

Berikut adalah kode yang berfungsi, zip semua file dari folder sumber dan membuat file zip di folder tujuan.

    $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.."
Arkesh Patel
sumber
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)
    }

Catatan:
ZipName: Path Lengkap dari File Zip yang ingin Anda buat.

SourceDirectory: Path lengkap ke direktori yang berisi file yang ingin Anda zip.

Venkatakrishnan
sumber
3

Ini adalah versi yang sedikit lebih baik dari jawaban sonjz, itu menambahkan opsi menimpa.

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)
}
Lou O.
sumber
2
Bisakah Anda menjelaskan lebih lanjut jawaban Anda dengan menambahkan sedikit deskripsi tentang solusi yang Anda berikan?
abarisone
Saya mengambil jawaban sebelumnya dan memperbaikinya dengan menambahkan opsi menimpa, tidak banyak lagi yang bisa dikatakan!
Lou O.
3

Ini juga harus berfungsi untuk mengompresi file tunggal tanpa menggunakan folder temp dan menggunakan .Net 4.5 asli, yang dikonversi dari C # dari jawaban StackOverflow ini . Menggunakan sintaks menggunakan yang lebih baik diambil dari sini .

Pemakaian:

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

Kode:

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

Menggunakan:

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()
        }
    }
}
Mark Lopez
sumber
Luar biasa. Saya sedang mencari cara untuk menyalin satu file tanpa menggunakan shell.applicationbisnis itu atau 7-Zip / utilitas terpisah lainnya. Saya juga menyukai Using-Objectfungsi ini, meskipun saya menggunakan pendekatan yang lebih pendek, cepat-n-kotor tanpa itu.
Charlie Joynt
2

Saya menggunakan potongan ini untuk memeriksa folder backup database saya untuk file cadangan yang belum dikompres, kompres mereka menggunakan 7-Zip, dan akhirnya menghapus *.bakfile untuk menghemat ruang disk. File pemberitahuan dipesan berdasarkan panjangnya (terkecil ke terbesar) sebelum kompresi untuk menghindari beberapa file tidak dikompresi.

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

Di sini Anda dapat memeriksa skrip PowerShell untuk mencadangkan, mengompres, dan mentransfer file-file itu melalui FTP .

Nathan
sumber
2

Jika Anda menginstal 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;
}

Arti argumen: afzip membuat arsip zip, df menghapus file, ep1 tidak membuat jalur direktori lengkap dalam arsip

Roman O
sumber
2

Di sini contoh baris perintah lengkap untuk memulai dari cmd.exe atau dari ssh atau apa yang Anda inginkan!

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

Salam

Alex
sumber
2

Memuat [System.IO.IOException]kelas dan menggunakan metodenya adalah langkah penting untuk menekan kesalahan yang tidak diinginkan, karena itu adalah kelas yang bukan asli PowerShell, jadi harapkan berbagai konteks kesalahan tanpa itu.

Saya mengontrol script saya ke T, tetapi mendapatkan banyak output 'file exist' ekstra merah saat menggunakan [System.IO.Compression.ZipFile]kelas

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

Apa yang saya lakukan di sini adalah menangkap Kesalahan IO ini, seperti mengakses file yang sudah ada, menangkap kesalahan itu dan mengarahkannya ke file log yang saya pertahankan dengan program yang lebih besar.

Paul Latour
sumber
2

Perintah baris perintah lengkap di Windows untuk Mengompresi dan Mengekstrak Direktori adalah sebagai berikut:

  • Untuk Kompresi:

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

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

Script ini mengulang semua direktori dan zip masing-masing

Dapatkan-ChildItem -Attributes d | foreach {write-zip $ .Name "$ ($ .Name) .zip"}

Gerardo
sumber
1
Satu-satunya bagian yang relevan dengan pertanyaan berusia 7 tahun ini adalah "write-zip", yang merupakan jawaban yang diterima pada tahun 2009.
Ditolak