[powershell] PowerShell을 사용하여 Zip 보관 파일을 만드는 방법은 무엇입니까?

PowerShell을 사용하여 zip 아카이브를 만들 수 있습니까?



답변

CodePlex를 방문하여 PowerShell Community Extensions 를 가져 오면 해당 write-zipcmdlet을 사용할 수 있습니다 .

이후

CodePlex가 종료 준비 중 읽기 전용 모드입니다

PowerShell 갤러리 로 이동할 수 있습니다 .


답변

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-ArchiveExpand-Archivecmdlet. 링크 된 페이지에는 전체 예제가 있지만 요점은 다음과 같습니다.

# 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


답변

최신 .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"


답변

초기 답변이 게시 된 이후 로트가 변경되었습니다. 다음은 압축 아카이브 명령을 사용하는 최신 예 입니다.

명령, 새 아카이브 파일을 생성하는 Draft.zip두 개의 파일을 압축하여, Draftdoc.docxdiagram2.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.docxDiagram [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를 사용하려면 구성 파일에 지원되지 않는 조정이 필요합니다 .