답변:
CodePlex를 방문하여 PowerShell Community Extensions 를 가져 오면 해당 write-zip
cmdlet을 사용할 수 있습니다 .
이후
CodePlex가 종료 준비 중 읽기 전용 모드입니다
PowerShell 갤러리 로 이동할 수 있습니다 .
write-zip [input file/folder] [output file]
PowerShell 3 및 .NET 4.5와 함께 작동하는 순수한 PowerShell 대안 (사용할 수있는 경우) :
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)
}
생성하려는 zip 아카이브의 전체 경로와 압축하려는 파일이 포함 된 디렉토리의 전체 경로를 전달하십시오.
PowerShell v5.0 추가 Compress-Archive
및 Expand-Archive
cmdlet. 링크 된 페이지에는 전체 예제가 있지만 요점은 다음과 같습니다.
# 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
설명의 단락 2에서 : "... 압축 아카이브를 사용하여 압축 할 수있는 최대 파일 크기는 현재 2GB입니다. 이는 기본 API의 System.IO.Compression.ZipFile
제한입니다. "그러나 사용 하는 경우이 제한을 무시할 수 있습니다.
System.IO.Compression.ZipFile
. 사용중인 .NET 프레임 워크에이 제한이 없으면 CmdLet이이 제한에 도달하지 않아야합니다. 코드에서 확인했습니다.
-OutputPath
매개 변수 가 없습니다 .
최신 .NET 4.5 프레임 워크를 사용하는 기본 방식이지만 기능이 거의 없습니다.
창조:
Add-Type -Assembly "System.IO.Compression.FileSystem" ;
[System.IO.Compression.ZipFile]::CreateFromDirectory("c:\your\directory\to\compress", "yourfile.zip") ;
추출:
Add-Type -Assembly "System.IO.Compression.FileSystem" ;
[System.IO.Compression.ZipFile]::ExtractToDirectory("yourfile.zip", "c:\your\destination") ;
언급했듯이 완전히 기능이 없으므로 덮어 쓰기 플래그를 기대하지 마십시오 .
업데이트 : 지난 몇 년 동안 확장 된 다른 개발자는 아래를 참조하십시오 ...
7zip을 설치하거나 대신 명령 행 버전을 다운로드하고이 PowerShell 방법을 사용하십시오.
function create-7zip([String] $aDirectory, [String] $aZipfile){
[string]$pathToZipExe = "$($Env:ProgramFiles)\7-Zip\7z.exe";
[Array]$arguments = "a", "-tzip", "$aZipfile", "$aDirectory", "-r";
& $pathToZipExe $arguments;
}
다음과 같이 호출 할 수 있습니다.
create-7zip "c:\temp\myFolder" "c:\temp\myFolder.zip"
& "C:\Program Files\7-Zip\7z.exe" a -tzip ($file.FullName+".zip") $file.FullName
초기 답변이 게시 된 이후 로트가 변경되었습니다. 다음은 압축 아카이브 명령을 사용하는 최신 예 입니다.
명령, 새 아카이브 파일을 생성하는 Draft.zip
두 개의 파일을 압축하여, Draftdoc.docx
과 diagram2.vsd
에 의해 지정된 Path
매개 변수입니다. 이 작업에 지정된 압축 수준은 최적입니다.
Compress-Archive -Path C:\Reference\Draftdoc.docx, C:\Reference\Images\diagram2.vsd -CompressionLevel Optimal -DestinationPath C:\Archives\Draft.Zip
명령, 새 아카이브 파일을 생성하는 Draft.zip
두 개의 파일을 압축하여, Draft doc.docx
과 Diagram [2].vsd
에 의해 지정된 LiteralPath
매개 변수입니다. 이 작업에 지정된 압축 수준은 최적입니다.
Compress-Archive -LiteralPath 'C:\Reference\Draft Doc.docx', 'C:\Reference\Images\Diagram [2].vsd' -CompressionLevel Optimal -DestinationPath C:\Archives\Draft.Zip
폴더 Draft.zip
에 새 보관 파일을 만드는 명령 C:\Archives
입니다. Path 파일의 특정 파일 이름 대신 와일드 카드 문자가 사용 되었기 때문에 새 보관 파일에는 C : \ Reference 폴더 의 모든 파일이 포함됩니다 .
Compress-Archive -Path C:\Reference\* -CompressionLevel Fastest -DestinationPath C:\Archives\Draft
Command는 전체 폴더에서 아카이브를 생성합니다. C:\Reference
Compress-Archive -Path C:\Reference -DestinationPath C:\Archives\Draft
PowerShell .zip
은 파일 이름에 확장명을 자동으로 추가합니다 .
두 가지 편집 -이 코드는 옛날부터 못생긴 못생긴 kluge입니다. 당신은 그것을 원하지 않습니다.
이 내용 압축 .\in
에 .\out.zip
예 다음 System.IO.Packaging.ZipPackage과를 여기에
$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()
편집 : 큰 파일, 신뢰할 수 없음 , 10MB 이상, YMMV 뭔가 해야 할 일 의 AppDomain 증거와 고립 된 스토리지. 친숙한 .NET 4.5 접근 방식 은 PS v3에서 잘 작동하지만 필자의 경우 더 많은 메모리를 원했습니다. PS v2에서 .NET 4를 사용하려면 구성 파일에 지원되지 않는 조정이 필요합니다 .
다른 옵션을 제공합니다. 이것은 전체 폴더를 압축하고 주어진 이름으로 주어진 경로에 아카이브를 씁니다.
.NET 3 이상 필요
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을 사용하여 Compress-Archive
Zip 파일 만들기 cmdlet을 사용하는 PowerShell v5 용 기본 솔루션입니다 .
Compress-Archive 용 Microsoft 문서도 참조하십시오 .
예 1 :
Compress-Archive `
-LiteralPath C:\Reference\Draftdoc.docx, C:\Reference\Images\diagram2.vsd `
-CompressionLevel Optimal `
-DestinationPath C:\Archives\Draft.Zip
예 2 :
Compress-Archive `
-Path C:\Reference\* `
-CompressionLevel Fastest `
-DestinationPath C:\Archives\Draft
예 3 :
Write-Output $files | Compress-Archive -DestinationPath $outzipfile
압축을 위해 라이브러리를 사용합니다 ( Michael이 제안한 것처럼 7-Zip이 좋습니다 ).
7-Zip 을 설치 하면 설치된 디렉토리 7z.exe
에 콘솔 응용 프로그램 이 포함 됩니다.
직접 호출하여 원하는 압축 옵션을 사용할 수 있습니다.
DLL을 사용하려면 가능할 수도 있습니다.
7-Zip은 프리웨어 및 오픈 소스입니다.
무엇에 대해 System.IO.Packaging.ZipPackage
?
.NET 3.0 이상이 필요합니다.
#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()
왜 아무도 문서를 보지 않습니까 ?? 빈 zip 파일을 만들고 모든 파일을 참조하는 동일한 .NET 4.5 라이브러리에 내장 된 개별 파일을 추가 하는 지원되는 방법 이 있습니다.
코드 예제는 아래를 참조하십시오.
# 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()
내가하는 것이 좋습니다 설명서를 찾아 당신이있는 경우에 어떤 질문을.
이것은 실제로 모호하지만 작동합니다. 7za.exe 는 독립형 버전 7zip이며 설치 패키지와 함께 사용할 수 있습니다.
# 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
}
누군가가 단일 파일 (폴더가 아닌)을 압축해야하는 경우 : 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
다음은 소스 폴더의 모든 파일을 압축하고 대상 폴더에 zip 파일을 만드는 작업 코드입니다.
$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)
}
참고 :
ZipName : 생성하려는 Zip 파일의 전체 경로입니다.
SourceDirectory : 압축하려는 파일이 들어있는 디렉토리의 전체 경로입니다.
다음은 sonjz의 답변이 약간 개선 된 버전이며 덮어 쓰기 옵션이 추가되었습니다.
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)
}
이것은 또한 임시 폴더를 사용하지 않고 단일 파일을 압축 하고이 StackOverflow 응답의 C #에서 변환 된 기본 .Net 4.5를 사용하여 작동 합니다. 여기 에서 가져온 구문을 사용하여 더 잘 사용합니다 .
용법:
ZipFiles -zipFilename output.zip -sourceFile input.sql -filename name.inside.zip.sql
암호:
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)
}
}
}
사용 :
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
사업이나 7-Zip / 다른 별도 유틸리티 를 사용하지 않고 하나의 파일을 압축하는 방법을 찾고있었습니다 . 나는 그 Using-Object
기능을 사용하지 않고 더 짧고 빠른 방법을 사용했지만 함수도 좋아합니다 .
이 스 니펫을 사용하여 데이터베이스 백업 폴더에서 아직 압축되지 않은 백업 파일을 확인하고 7-Zip을 사용하여 압축 한 다음 *.bak
파일을 삭제하여 디스크 공간을 절약합니다. 주의 사항 파일은 압축되지 않은 파일을 피하기 위해 압축 전에 길이 (가장 작은 것에서 가장 큰 것)로 정렬됩니다.
$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 }
여기 에서 FTP를 통해 해당 파일을 백업, 압축 및 전송할 수있는 PowerShell 스크립트를 확인할 수 있습니다 .
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;
}
인수의 의미 : afzip은 zip 아카이브를 작성하고 df는 파일을 삭제하며 ep1은 아카이브 내에 전체 디렉토리 경로를 작성하지 않습니다.
로딩 [System.IO.IOException]
PowerShell에 기본이 아닌 클래스이기 때문에 원하지 않는 오류를 억제하기 위해서는 클래스를 해당 메서드를 사용하는 것이 중요하므로 다양한 오류 컨텍스트가 필요합니다.
스크립트를 T로 오류 제어했지만 [System.IO.Compression.ZipFile]
클래스 를 사용하는 동안 여분의 빨간색 '파일이 있습니다'출력이 발생했습니다.
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
}
}
내가 여기서하고있는 일은 이미 존재하는 파일에 액세스하고, 오류를 잡아서 더 큰 프로그램으로 유지 관리하는 로그 파일로 보내는 것과 같은 IO 오류를 포착하는 것입니다.
디렉토리 압축 및 추출을위한 Windows의 전체 명령 행 명령은 다음과 같습니다.
압축의 경우 :
powershell.exe -nologo -noprofile -command "& { Add-Type -A 'System.IO.Compression.FileSystem'; [IO.Compression.ZipFile]::CreateFromDirectory('C:\Indus','C:\Indus.zip'); }"
추출의 경우 :
powershell.exe -nologo -noprofile -command "& { Add-Type -A 'System.IO.Compression.FileSystem';[IO.Compression.ZipFile]::ExtractToDirectory('C:\Indus.zip','C:\Indus'); }"