Có thể tạo một kho lưu trữ zip bằng PowerShell không?
Có thể tạo một kho lưu trữ zip bằng PowerShell không?
Câu trả lời:
Nếu bạn truy cập CodePlex và lấy Tiện ích mở rộng cộng đồng PowerShell , bạn có thể sử dụng write-zip
lệnh ghép ngắn của họ .
Từ
CodePlex ở chế độ chỉ đọc để chuẩn bị tắt máy
bạn có thể vào Thư viện PowerShell .
write-zip [input file/folder] [output file]
Một thay thế PowerShell thuần hoạt động với PowerShell 3 và .NET 4.5 (nếu bạn có thể sử dụng nó):
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)
}
Chỉ cần chuyển vào đường dẫn đầy đủ đến kho lưu trữ zip mà bạn muốn tạo và đường dẫn đầy đủ đến thư mục chứa các tệp bạn muốn nén.
PowerShell v5.0 thêm Compress-Archive
và Expand-Archive
lệnh ghép ngắn. Các trang được liên kết có ví dụ đầy đủ, nhưng ý chính của nó là:
# 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
Mô tả: "... kích thước tệp tối đa bạn có thể nén bằng cách sử dụng Nén-Lưu trữ hiện là 2 GB. Đây là giới hạn của API cơ bản" Tuy nhiên, nếu bạn sử dụng, System.IO.Compression.ZipFile
bạn có thể bỏ qua giới hạn này.
System.IO.Compression.ZipFile
. Nếu .NET framework bạn đang sử dụng không có giới hạn này, CmdLet không nên đạt giới hạn này. Tôi đã xác minh trong mã.
-OutputPath
tham số.
Một cách riêng với khung .NET 4.5 mới nhất, nhưng hoàn toàn không có tính năng:
Sự sáng tạo:
Add-Type -Assembly "System.IO.Compression.FileSystem" ;
[System.IO.Compression.ZipFile]::CreateFromDirectory("c:\your\directory\to\compress", "yourfile.zip") ;
Khai thác:
Add-Type -Assembly "System.IO.Compression.FileSystem" ;
[System.IO.Compression.ZipFile]::ExtractToDirectory("yourfile.zip", "c:\your\destination") ;
Như đã đề cập, hoàn toàn không có tính năng, vì vậy đừng mong đợi một cờ ghi đè .
CẬP NHẬT: Xem bên dưới cho các nhà phát triển khác đã mở rộng về điều này trong những năm qua ...
Cài đặt 7zip (hoặc tải xuống phiên bản dòng lệnh thay thế) và sử dụng phương thức PowerShell này:
function create-7zip([String] $aDirectory, [String] $aZipfile){
[string]$pathToZipExe = "$($Env:ProgramFiles)\7-Zip\7z.exe";
[Array]$arguments = "a", "-tzip", "$aZipfile", "$aDirectory", "-r";
& $pathToZipExe $arguments;
}
Bạn có thể gọi nó như thế này:
create-7zip "c:\temp\myFolder" "c:\temp\myFolder.zip"
& "C:\Program Files\7-Zip\7z.exe" a -tzip ($file.FullName+".zip") $file.FullName
Rất nhiều đã thay đổi kể từ khi câu trả lời ban đầu được đăng. Dưới đây là một số ví dụ mới nhất sử dụng lệnh Compress-Archive .
Lệnh tạo tệp lưu trữ mới Draft.zip
, bằng cách nén hai tệp Draftdoc.docx
và diagram2.vsd
được chỉ định bởi Path
tham số. Mức nén được chỉ định cho thao tác này là Tối ưu.
Compress-Archive -Path C:\Reference\Draftdoc.docx, C:\Reference\Images\diagram2.vsd -CompressionLevel Optimal -DestinationPath C:\Archives\Draft.Zip
Lệnh tạo tệp lưu trữ mới Draft.zip
, bằng cách nén hai tệp Draft doc.docx
và Diagram [2].vsd
được chỉ định bởi LiteralPath
tham số. Mức nén được chỉ định cho thao tác này là Tối ưu.
Compress-Archive -LiteralPath 'C:\Reference\Draft Doc.docx', 'C:\Reference\Images\Diagram [2].vsd' -CompressionLevel Optimal -DestinationPath C:\Archives\Draft.Zip
Lệnh tạo tệp lưu trữ mới Draft.zip
, trong C:\Archives
thư mục. Tệp lưu trữ mới chứa mọi tệp trong thư mục C: \ Reference , vì ký tự đại diện được sử dụng thay cho tên tệp cụ thể trong tham số Đường dẫn .
Compress-Archive -Path C:\Reference\* -CompressionLevel Fastest -DestinationPath C:\Archives\Draft
Lệnh tạo một kho lưu trữ từ toàn bộ thư mục, C:\Reference
Compress-Archive -Path C:\Reference -DestinationPath C:\Archives\Draft
PowerShell tự động thêm .zip
phần mở rộng vào tên tệp.
Chỉnh sửa hai - Mã này là một kluge xấu xí, xấu xí từ thời xa xưa. Bạn không muốn điều đó.
Đây nén nội dung của .\in
để .\out.zip
với System.IO.Packaging.ZipPackage làm theo tấm gương ở đây
$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()
Chỉnh sửa: Không đáng tin cậy cho các tệp lớn hơn, có thể> 10mb, YMMV. Một cái gì đó để làm với bằng chứng appdomain và lưu trữ bị cô lập. Cách tiếp cận .NET 4.5 thân thiện hơn hoạt động độc đáo từ PS v3, nhưng muốn có thêm bộ nhớ trong trường hợp của tôi. Để sử dụng .NET 4 từ PS v2, các tệp cấu hình cần một tinh chỉnh không được hỗ trợ .
Đưa ra bên dưới một lựa chọn khác. Điều này sẽ nén một thư mục đầy đủ và sẽ ghi lưu trữ vào một đường dẫn cụ thể với tên đã cho.
Yêu cầu .NET 3 trở lên
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)
Đây là một giải pháp gốc cho PowerShell v5, sử dụng lệnh ghép ngắn Compress-Archive
Tạo các tệp Zip bằng PowerShell .
Xem thêm Microsoft Docs cho Nén-Lưu trữ .
Ví dụ 1:
Compress-Archive `
-LiteralPath C:\Reference\Draftdoc.docx, C:\Reference\Images\diagram2.vsd `
-CompressionLevel Optimal `
-DestinationPath C:\Archives\Draft.Zip
Ví dụ 2:
Compress-Archive `
-Path C:\Reference\* `
-CompressionLevel Fastest `
-DestinationPath C:\Archives\Draft
Ví dụ 3:
Write-Output $files | Compress-Archive -DestinationPath $outzipfile
Để nén, tôi sẽ sử dụng một thư viện (7-Zip là tốt như Michal gợi ý ).
Nếu bạn cài đặt 7-Zip , thư mục đã cài đặt sẽ chứa 7z.exe
ứng dụng bảng điều khiển.
Bạn có thể gọi nó trực tiếp và sử dụng bất kỳ tùy chọn nén nào bạn muốn.
Nếu bạn muốn tham gia với DLL, điều đó cũng có thể.
7-Zip là phần mềm miễn phí và mã nguồn mở.
Thế còn System.IO.Packaging.ZipPackage
?
Nó sẽ yêu cầu .NET 3.0 trở lên.
#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()
thông qua Anders Hesselbom
Tại sao không ai nhìn vào tài liệu ?? Có một phương pháp được hỗ trợ để tạo một tệp zip trống và thêm các tệp riêng lẻ vào tệp thư viện .NET 4.5 mà mọi người đều tham khảo.
Xem bên dưới để biết ví dụ về mã:
# 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()
Tôi khuyến khích bạn duyệt tài liệu nếu bạn có bất kỳ câu hỏi.
Điều này thực sự tối nghĩa nhưng hoạt động. 7za.exe là phiên bản độc lập của 7zip và có sẵn với gói cài đặt.
# 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
}
Nếu ai đó cần nén một tệp duy nhất (chứ không phải thư mục): http://bloss.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
Đây là mã làm việc, nén tất cả các tệp từ thư mục nguồn và tạo tệp zip trong thư mục đích.
$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)
}
Ghi chú:
ZipName: Đường dẫn đầy đủ của tệp Zip mà bạn muốn tạo.
SourceDirectory: Đường dẫn đầy đủ đến thư mục chứa các tệp mà bạn muốn nén.
Đây là một phiên bản cải tiến của câu trả lời của sonjz, nó thêm tùy chọn ghi đè.
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)
}
Điều này cũng sẽ hoạt động để nén một tệp mà không sử dụng thư mục tạm thời và sử dụng .Net 4.5 gốc, được chuyển đổi từ C # từ câu trả lời StackOverflow này . Nó sử dụng một cú pháp đẹp hơn bằng cách sử dụng cú pháp được lấy từ đây .
Sử dụng:
ZipFiles -zipFilename output.zip -sourceFile input.sql -filename name.inside.zip.sql
Mã số:
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)
}
}
}
Sử dụng:
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
doanh nghiệp đó hoặc 7-Zip / các tiện ích riêng biệt khác. Tôi cũng thích Using-Object
chức năng này, mặc dù tôi đã thực hiện một cách tiếp cận ngắn hơn, nhanh chóng và không có điều đó.
Tôi sử dụng đoạn mã này để kiểm tra thư mục sao lưu cơ sở dữ liệu của mình để biết các tệp sao lưu chưa được nén, nén chúng bằng 7-Zip và cuối cùng xóa các *.bak
tệp để tiết kiệm dung lượng đĩa. Các tệp thông báo được sắp xếp theo độ dài (nhỏ nhất đến lớn nhất) trước khi nén để tránh một số tệp không được nén.
$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 }
Tại đây, bạn có thể kiểm tra tập lệnh PowerShell để sao lưu, nén và chuyển các tệp đó qua FTP .
Trong trường hợp bạn đã cài đặt 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;
}
Ý nghĩa của các đối số: afzip tạo tệp lưu trữ zip, df xóa các tệp, ep1 không tạo đường dẫn thư mục đầy đủ trong kho lưu trữ
Dưới đây là một ví dụ dòng lệnh hoàn chỉnh để khởi chạy từ cmd.exe hoặc từ ssh hoặc những gì bạn muốn!
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');}"
Trân trọng
Đang tải [System.IO.IOException]
lớp và sử dụng các phương thức của nó là một bước quan trọng để loại bỏ các lỗi không mong muốn, vì thực tế đó là một lớp không có nguồn gốc từ PowerShell, vì vậy hãy mong đợi các bối cảnh lỗi khác nhau mà không có nó.
Tôi đã kiểm soát lỗi tập lệnh của mình thành T, nhưng có thêm đầu ra 'tệp đỏ' tồn tại trong khi sử dụng [System.IO.Compression.ZipFile]
lớp
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
}
}
Những gì tôi đang làm ở đây là bắt các lỗi IO này, chẳng hạn như truy cập các tệp đã tồn tại, bắt lỗi đó và hướng nó đến một logfile mà tôi đang duy trì với một chương trình lớn hơn.
Các lệnh dòng lệnh hoàn chỉnh trong Windows để nén và trích xuất thư mục như sau:
Để nén:
powershell.exe -nologo -noprofile -command "& { Add-Type -A 'System.IO.Compression.FileSystem'; [IO.Compression.ZipFile]::CreateFromDirectory('C:\Indus','C:\Indus.zip'); }"
Để giải nén:
powershell.exe -nologo -noprofile -command "& { Add-Type -A 'System.IO.Compression.FileSystem';[IO.Compression.ZipFile]::ExtractToDirectory('C:\Indus.zip','C:\Indus'); }"
Cách tiếp cận ion đá:
https://dotnetzip.codeplex.com/wikipage?title=PS- Ví dụ
hỗ trợ mật khẩu, các phương thức mật mã khác, v.v.