Apakah mungkin membuat arsip zip menggunakan PowerShell?
Apakah mungkin membuat arsip zip menggunakan PowerShell?
Jawaban:
Jika Anda menuju ke CodePlex dan ambil Ekstensi Komunitas PowerShell , Anda dapat menggunakan write-zip
cmdlet mereka .
Sejak
CodePlex dalam mode read-only dalam persiapan untuk shutdown
Anda bisa pergi ke Galeri PowerShell .
write-zip [input file/folder] [output file]
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.
PowerShell v5.0 menambahkan Compress-Archive
dan Expand-Archive
cmdlet. 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
Compress-Archive
Deskripsi: "... 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.ZipFile
Anda dapat melewati batasan ini.
System.IO.Compression.ZipFile
. Jika .NET framework yang Anda gunakan tidak memiliki batas ini, CmdLet tidak boleh mencapai batas ini. Saya memverifikasi dalam kode.
-OutputPath
parameter.
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 ...
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"
& "C:\Program Files\7-Zip\7z.exe" a -tzip ($file.FullName+".zip") $file.FullName
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.docx
dan diagram2.vsd
, ditentukan oleh Path
parameter. 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.docx
dan Diagram [2].vsd
, ditentukan oleh LiteralPath
parameter. 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:\Archives
folder. 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 .zip
ekstensi ke nama file secara otomatis.
Sunting dua - Kode ini jelek, kluge jelek dari masa lalu. Kamu tidak menginginkannya.
Ini kompres isi .\in
untuk .\out.zip
dengan 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 .
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)
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
Untuk kompresi, saya akan menggunakan perpustakaan (7-Zip bagus seperti yang disarankan Michal ).
Jika Anda menginstal 7-Zip , direktori yang diinstal akan berisi 7z.exe
aplikasi 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.
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
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.
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
}
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
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.."
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.
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)
}
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()
}
}
}
shell.application
bisnis itu atau 7-Zip / utilitas terpisah lainnya. Saya juga menyukai Using-Object
fungsi ini, meskipun saya menggunakan pendekatan yang lebih pendek, cepat-n-kotor tanpa itu.
Saya menggunakan potongan ini untuk memeriksa folder backup database saya untuk file cadangan yang belum dikompres, kompres mereka menggunakan 7-Zip, dan akhirnya menghapus *.bak
file 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 .
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
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
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.
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'); }"
Batuan pendekatan ionik:
https://dotnetzip.codeplex.com/wikipage?title=PS-Examples
mendukung kata sandi, metode crypto lainnya, dll.
Script ini mengulang semua direktori dan zip masing-masing
Dapatkan-ChildItem -Attributes d | foreach {write-zip $ .Name "$ ($ .Name) .zip"}