PowerShell을 사용하여 zip 아카이브를 만들 수 있습니까?
답변
CodePlex를 방문하여 PowerShell Community Extensions 를 가져 오면 해당 write-zip
cmdlet을 사용할 수 있습니다 .
이후
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-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
답변
최신 .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.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를 사용하려면 구성 파일에 지원되지 않는 조정이 필요합니다 .