Computer >> 컴퓨터 >  >> 체계 >> Windows Server

PowerShell로 ZIP 아카이브를 만들고 파일 압축을 푸는 방법은 무엇입니까?

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

PowerShell로 ZIP 아카이브를 만들고 파일 압축을 푸는 방법은 무엇입니까?

이 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

PowerShell로 ZIP 아카이브를 만들고 파일 압축을 푸는 방법은 무엇입니까?

여러 폴더(모든 파일 및 중첩 폴더 포함)의 전체 내용을 압축할 수 있습니다.

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

힌트 .Microsoft.PowerShell.Archive 모듈은 System.IO.Compression.ZipArchive 클래스를 사용하기 때문에 2GB보다 큰 파일을 압축할 수 없습니다(기본 API의 제한이 있기 때문에). 더 큰 파일을 압축하려고 하면 오류가 나타납니다.

PowerShell로 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

PowerShell로 ZIP 아카이브를 만들고 파일 압축을 푸는 방법은 무엇입니까?

Microsoft.PowerShell.Archive 모듈의 단점:

  • 압축을 풀지 않으면 아카이브의 내용을 볼 수 없습니다.
  • 아카이브에서 일부 파일을 추출할 수 없습니다(전체 아카이브 파일을 추출해야 함).
  • zip을 제외한 다른 아카이브 형식은 사용할 수 없습니다.
  • ZIP 아카이브를 비밀번호로 보호할 수 없습니다.
더 복잡한 경우에는 타사 도구를 사용하여 PowerShell 스크립트에서 보관을 수행해야 합니다. 예:7zip 또는 7Zip4Powershell 모듈.

다음과 같이 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)

PowerShell로 ZIP 아카이브를 만들고 파일 압축을 푸는 방법은 무엇입니까?

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

PowerShell로 ZIP 아카이브를 만들고 파일 압축을 푸는 방법은 무엇입니까?

또는 추가 정보(압축/비압축 파일 크기, 마지막 쓰기 시간 등)와 함께 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()

PowerShell로 ZIP 아카이브를 만들고 파일 압축을 푸는 방법은 무엇입니까?

ZIP 파일을 C:\Logs 폴더에 추출하려면 다음 명령을 사용하십시오.

$SourceZipFile = 'C:\PS\logs.zip'
$TargetFolder = 'C:\Logs'
[IO.Compression.ZipFile]::ExtractToDirectory($SourceZipFile, $TargetFolder)