PowerShell의 기능을 사용하여 ZIP 아카이브를 만들고 추출할 수 있습니다. PowerShell 5.0(이 PowerShell 버전은 Windows 10에 기본적으로 설치됨)에서 별도의 모듈 Microsoft.PowerShell.Archive 사용할 수 있습니다. 이전 버전의 Windows에서는 ZipFile을 사용할 수 있습니다. 보관을 위한 .NET Framework의 클래스입니다.
Microsoft.PowerShell.Archive 모듈(C:\Windows\System32\WindowsPowerShell\v1.0\Modules\Microsoft.PowerShell.Archive)에는 두 개의 cmdlet만 있습니다.
- 압축 아카이브
- 확장 아카이브
Get-Command -Module Microsoft.PowerShell.Archive | Format-Table -AutoSize
CommandType Name Version Source ----------- ---- ------- ------ Function Compress-Archive 1.0.1.0 Microsoft.PowerShell.Archive Function Expand-Archive 1.0.1.0 Microsoft.PowerShell.Archive
이 cmdlet을 사용하여 PowerShell 스크립트에서 ZIP 아카이브를 만들고 추출하는 예를 살펴보겠습니다.
PowerShell:압축 아카이브로 ZIP 아카이브 만들기
압축 아카이브 명령의 구문은 다음과 같습니다.
Compress-Archive [-Path] String[] [-DestinationPath] String [-CompressionLevel String ] [-Update]
- 경로 매개변수는 아카이브할 파일 또는 폴더의 경로를 지정하는 데 사용됩니다.
- 대상 경로 – ZIP 파일의 경로를 지정합니다.
- 압축 수준 – 압축 수준 설정(
NoCompression
,Optimal
또는Fastest
); - 업데이트 – 기존 ZIP 아카이브에 파일을 추가(업데이트)할 수 있습니다.
- 힘 – 지정된 이름의 아카이브가 이미 존재하는 경우 덮어씁니다.
- 최적 — 압축 수준에 따른 최적화
- 가장 빠름 — 소요 시간에 따른 최적화
- 압축 없음 — 압축 없이.
이미 압축된 파일(jpg, msi, mp3 등)을 단일 ZIP 파일로 보관할 때 NoCompression 옵션을 사용해야 합니다. 이 경우 Windows는 압축하는 데 CPU 시간을 낭비하지 않습니다.
단일 파일을 압축하려면 다음을 실행하십시오.
Compress-Archive -Path "C:\Logs\WindowsUpdate.log" -DestinationPath C:\Archive\updatelog.zip -CompressionLevel Optimal
여러 폴더(모든 파일 및 중첩 폴더 포함)의 전체 내용을 압축할 수 있습니다.
Compress-Archive -Path C:\Logs\,C:\Logs2\ -DestinationPath C:\Archive\logs-all.zip -CompressionLevel Optimal
특정 마스크가 있는 파일만 ZIP 아카이브에 추가할 수 있습니다. 예를 들어 다음 명령은 *.txt 파일만 압축합니다.
Compress-Archive -Path C:\Logs\*.txt -DestinationPath C:\Archive\logs-txt.zip –CompressionLevel Fastest
Get-ChildItem cmdlet과 함께 더 복잡한 필터를 사용할 수 있습니다. 예를 들어 다음 스크립트를 사용하면 디스크에서 확장자가 *.docx 또는 *.xlsx인 가장 큰 상위 10개 파일을 찾아 아카이브에 추가할 수 있습니다.
Get-ChildItem c:\share\ITdept -Include *.xlsx –Recurse| sort -descending -property length | select -first 10 |Compress-Archive -DestinationPath C:\backup\itdeptdocs.zip
기존 zip 아카이브에 새 파일을 추가하려면 업데이트를 사용하세요. 키:
Compress-Archive -Path C:\Logs\,C:\logs2\ –Update -DestinationPath C:\Archive\logs-txt.zip
Exception calling "Write" with "3" argument(s): "Stream was too long." At C:\Windows\system32\WindowsPowerShell\v1.0\Modules\Microsoft.PowerShell.Archive\Microsoft.PowerShell.Archive.psm1:805 char:29 + ... $destStream.Write($buffer, 0, $numberOfBytesRead) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : IOException
확장 아카이브로 ZIP 파일을 추출하는 방법
Expand-Archive cmdlet을 사용하여 ZIP 파일의 압축을 풀 수 있습니다. cmdlet의 구문은 다음과 유사합니다.
Expand-Archive [-Path] String [-DestinationPath] String [-Force] [-Confirm]
예를 들어, 이전에 생성한 ZIP 아카이브의 압축을 지정된 폴더에 풀고 파일을 덮어쓰려면:
Expand-Archive -Path C:\archive\logs-all.zip -DestinationPath c:\logs -Force
Microsoft.PowerShell.Archive 모듈의 단점:
- 압축을 풀지 않으면 아카이브의 내용을 볼 수 없습니다.
- 아카이브에서 일부 파일을 추출할 수 없습니다(전체 아카이브 파일을 추출해야 함).
- zip을 제외한 다른 아카이브 형식은 사용할 수 없습니다.
- ZIP 아카이브를 비밀번호로 보호할 수 없습니다.
다음과 같이 7Zip4Powershell 모듈을 설치하고 비밀번호로 보호된 zip 파일을 추출할 수 있습니다.
Install-Module -Name 7Zip4Powershell
Expand-7Zip -ArchiveFileName C:\Archive\Logs.zip -Password "p@ssd0rw" -TargetPath C:\Share\Logs
PowerShell ZipFile 클래스로 압축 파일 작업
이전 Windows 버전(PowerShell 버전이 5.0 미만인 Windows 10 또는 Windows Server 2016 이전(PowerShell 버전을 업그레이드할 수 없는 경우))에서는 별도의 ZipFile 클래스(NET Framework 4.5)를 사용하여 zip 아카이브를 만들 수 있습니다.
먼저 PowerShell 세션에 클래스를 로드합니다.
Add-Type -AssemblyName "System.IO.Compression.FileSystem"
폴더를 보관하려면 다음과 같은 PS 스크립트를 사용하십시오.
$SourceFolder = 'C:\Logs'
$ZipFileName = 'C:\PS\logs.zip'
[IO.Compression.ZipFile]::CreateFromDirectory($SourceFolder, $ZipFileName)
ZIP 아카이브를 업데이트하고 압축률을 설정하려면 다음 PowerShell 코드를 사용하세요.
$addfile = ‘C:\temp\new.log’
$compressionLevel = [System.IO.Compression.CompressionLevel]::Fastest
$zip = [System.IO.Compression.ZipFile]::Open($zipFileName, 'update')[System.IO.Compression.ZipFileExtensions]::CreateEntryFromFile($zip, $addfile, (Split-Path $addfile -Leaf), $compressionLevel)
$zip.Dispose()
$zip.Dispose()
명령은 zip 파일을 닫는 데 사용됩니다. ZIP 아카이브의 내용을 나열할 수 있습니다.
[System.IO.Compression.ZipFile]::OpenRead($zipFileName).Entries.Name
또는 추가 정보(압축/비압축 파일 크기, 마지막 쓰기 시간 등)와 함께 zip 아카이브의 내용을 Out-GridView 테이블로 표시할 수 있습니다.
$ZipFileName = "C:\PS\logs1.zip"
$Stream = New-Object IO.FileStream($ZipFileName , [IO.FileMode]::Open)
$ZipArchive = New-Object IO.Compression.ZipArchive($Stream)
$ZipArchive.Entries |
Select-Object Name,
@{Name="File Path";Expression={$_.FullName}},
@{Name="Compressed Size (KB)";Expression={"{0:N2}" -f($_.CompressedLength/1kb)}},
@{Name="UnCompressed Size (KB)";Expression={"{0:N2}" -f($_.Length/1kb)}},
@{Name="File Date";Expression={$_.LastWriteTime}} | Out-GridView
$ZipArchive.Dispose()
$Stream.Close()
$Stream.Dispose()
ZIP 파일을 C:\Logs 폴더에 추출하려면 다음 명령을 사용하십시오.
$SourceZipFile = 'C:\PS\logs.zip'
$TargetFolder = 'C:\Logs'
[IO.Compression.ZipFile]::ExtractToDirectory($SourceZipFile, $TargetFolder)