PowerShell kullanarak bir zip arşivi oluşturmak mümkün müdür?
PowerShell kullanarak bir zip arşivi oluşturmak mümkün müdür?
Yanıtlar:
CodePlex'e gidip PowerShell Topluluk Uzantılarını alırsanız, write-zip
cmdlet'lerini kullanabilirsiniz .
Dan beri
CodePlex kapatma hazırlığında salt okunur modda
PowerShell Galerisi'ne gidebilirsiniz .
write-zip [input file/folder] [output file]
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.
PowerShell v5.0 ekler Compress-Archive
ve Expand-Archive
cmdlet'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
Compress-Archive
Açı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.ZipFile
sınırlamasıdır."
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.
-OutputPath
parametre yok .
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 ...
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"
& "C:\Program Files\7-Zip\7z.exe" a -tzip ($file.FullName+".zip") $file.FullName
İ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.zip
iki dosya sıkıştırarak, Draftdoc.docx
ve diagram2.vsd
tarafından belirtilen, Path
parametre. 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.zip
iki dosya sıkıştırarak, Draft doc.docx
ve Diagram [2].vsd
tarafından belirtilen, LiteralPath
parametre. 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.zip
de, C:\Archives
klasö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, .zip
uzantıyı dosya adına otomatik olarak ekler .
İki tane düzenle - Bu kod eski günlerden çirkin, çirkin bir kluge. Onu istemezsin.
Bu içeriğini sıkıştırır .\in
iç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 .
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)
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
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.exe
bir 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.
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
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.
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
}
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
İş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.."
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.
İş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)
}
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()
}
}
}
shell.application
iş veya 7-Zip / diğer ayrı yardımcı programları kullanmadan bir dosya zip için bir yol arıyordu . Ben de Using-Object
olmadan daha kısa, hızlı n-kirli bir yaklaşım için gitti rağmen fonksiyonu da seviyorum .
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 *.bak
bazı 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 .
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
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
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.
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'); }"
İyonik yaklaşım sallanır:
https://dotnetzip.codeplex.com/wikipage?title=PS-Examples
şifreleri, diğer kripto yöntemlerini vb. destekler.
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"}