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


답변:


124

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

이후

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

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


114
그리고 7z를 대부분의 압축 cmdlet의 핵심 라이브러리로 사용합니다. 나는 그것을 구현했기 때문에 알고있다;) +1
x0n

1
LOL 잘 했어, x0n. PSCX에서 피드 저장소 공급자를 강화했습니다. 약간 실용적이지 않지만 톤은 재미 있습니다. :)
Matt Hamilton

1
7z를 사용하는 경우 비밀번호를 사용하여 압축 할 수 있습니까?

1
@SemiDementedwrite-zip [input file/folder] [output file]
joshschreuder

9
파워 쉘 (5) .ZIP 생성하는 압축 아카이브 cmdlet을 함께 제공 blogs.technet.microsoft.com/heyscriptingguy/2015/08/13/...을
벤와 파트라에게

255

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 아카이브의 전체 경로와 압축하려는 파일이 포함 된 디렉토리의 전체 경로를 전달하십시오.


1
실제로 Powershell 3.0 또는 .net 4.5가 필요합니까? .net 프로그래밍 대신 실제 powershell 기능에 대해 매우 밝게 보입니다.
bwerks

@bwerks 여기
noam

하나의 큰 파일을 압축하는 방법을 찾고 있었지만 분명히 방법이 없습니다. 새 디렉토리를 작성하고 거기에 단일 파일을 복사하고 해당 디렉토리를 새 zip 파일로 압축 한 다음 정리할 디렉토리를 삭제하는 코드를 작성해야했습니다.
Baodad

1
@Baodad, 내 대답을 참조하십시오.
Dherik

전체 경로가 필요하다는 것을 읽었어야합니다. 혼란스러운 소년! BTW 이것은 정답입니다
Kolob Canyon

244

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

11
PowerShell v5.0이 공식적으로 릴리스되었습니다. 또한 Windows 10과 함께 제공됩니다.
Ohad Schneider


2
Compress-Archive설명의 단락 2에서 : "... 압축 아카이브를 사용하여 압축 할 수있는 최대 파일 크기는 현재 2GB입니다. 이는 기본 API의 System.IO.Compression.ZipFile제한입니다. "그러나 사용 하는 경우이 제한을 무시할 수 있습니다.
AMissico

2
2GB 제한은에서 상속되었습니다 System.IO.Compression.ZipFile. 사용중인 .NET 프레임 워크에이 제한이 없으면 CmdLet이이 제한에 도달하지 않아야합니다. 코드에서 확인했습니다.
TravisEz13

2
@Pramod -OutputPath매개 변수 가 없습니다 .
BrainSlugs83

57

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

언급했듯이 완전히 기능이 없으므로 덮어 쓰기 플래그를 기대하지 마십시오 .

업데이트 : 지난 몇 년 동안 확장 된 다른 개발자는 아래를 참조하십시오 ...


왜 특징없는 방법을 사용 하시겠습니까?
명왕성

게시 날짜 및 선행 날짜 순서대로 허용되는 답변이어야합니다. 업데이트 된 의견과 관련하여 현재이 작업을 수행하는 방법은 정말 많습니다. 이 기능이 필요하다는 사실에 직면하고 있으며 PowerShell 4에서 가장 먼저 찾은 것은 기본 방법입니다. 이것은 2009 년에 좋은 질문이었습니다. 나는 원래 질문했을 때 그 질문에 대한 추가 연구가 있었을 것이라고 생각합니다.
DtechNet

45

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"

6
7zip이 경로에 있으면 "& 7z c : \ temp \ myFolder c : \ temp \ myFolder.zip"
aboy021

5
설치하지 않으려면 대신 명령 행 버전을 다운로드 할 수 있습니다. (7-zip의 다운로드 페이지를보십시오.) 실행 파일 일 뿐이며 명령 구문은 동일합니다. 그러나 실행 파일은 다른 이름입니다. 어떤 이유로 7za.exe입니다. 나는 많은 프로젝트 에서이 작업을 수행했으며 결코 실망하지 않았습니다.
jpmc26

.net 및 Powershell 도구를 사용하여 7zip 경로를 바로 사용할 때까지 너무 오래 시도했습니다. $ file의 간단한 foreach 루프가 트릭을 수행합니다& "C:\Program Files\7-Zip\7z.exe" a -tzip ($file.FullName+".zip") $file.FullName
SebK

17

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

명령, 새 아카이브 파일을 생성하는 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은 파일 이름에 확장명을 자동으로 추가합니다 .


15

두 가지 편집 -이 코드는 옛날부터 못생긴 못생긴 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를 사용하려면 구성 파일에 지원되지 않는 조정이 필요합니다 .


ZipPackage의 주요 문제점은 일반 ZIP 파일이 아니지만 컨텐츠 xml 파일을 포함한다는 것입니다. 참조 : [.net ZipPackage 클래스의 [Content_Types] .xml을 피하는 방법-스택 오버플로] ( stackoverflow.com/questions/3748970/… )
aaron

@aaron 이것을 다시 사용하지 않는 또 하나의 큰 이유! "큰 문제"에 대한 경쟁이 치열합니다.;)
noam

12

다른 옵션을 제공합니다. 이것은 전체 폴더를 압축하고 주어진 이름으로 주어진 경로에 아카이브를 씁니다.

.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)

10

다음은 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

7

압축을 위해 라이브러리를 사용합니다 ( Michael이 제안한 것처럼 7-Zip이 좋습니다 ).

7-Zip 을 설치 하면 설치된 디렉토리 7z.exe에 콘솔 응용 프로그램 이 포함 됩니다.
직접 호출하여 원하는 압축 옵션을 사용할 수 있습니다.

DLL을 사용하려면 가능할 수도 있습니다.
7-Zip은 프리웨어 및 오픈 소스입니다.


2
여기에서 파워 쉘 AES 암호화 7 지퍼를 사용하는 예는 다음 codeblog.theg2.net/2010/02/...
그렉 브레이

7

무엇에 대해 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()

Anders Hesselbom 경유


5

왜 아무도 문서를 보지 않습니까 ?? 빈 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()

내가하는 것이 좋습니다 설명서를 찾아 당신이있는 경우에 어떤 질문을.


2
이것에 감사합니다, 이것은 완벽합니다. 특히 잘못 설계되었으며 압축 내부에 경로를 지정하는 좋은 방법이없는 Compress-Archive cmdlet과 비교할 때 특히 그렇습니다.
Rafael Kitover

4

이것은 실제로 모호하지만 작동합니다. 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

}

4

누군가가 단일 파일 (폴더가 아닌)을 압축해야하는 경우 : 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

이 코드는 쉘 응용 프로그램에 의존하고 500ms가 끝날 때까지 기다릴 것으로 추측합니다. 그러나 압축 파일을 추가하는 데 약간의 시간이 걸리는 모든 경우에 팝업을 생성합니다 (큰 파일을 추가하거나 큰 zip을 사용하여 쉽게 재생). 또한 zip 작업이 지정된 절전 시간보다 느리면 파일을 추가하지 못하고 팝업 대화 상자를 남깁니다. 이것은 스크립팅에 끔찍합니다. 또한 COM 객체에 의존하는 다른 대답은 이러한 함정을 다루지 않기 때문에 하향 조정했습니다.
Pluto

4

다음은 소스 폴더의 모든 파일을 압축하고 대상 폴더에 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.."

4
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 : 압축하려는 파일이 들어있는 디렉토리의 전체 경로입니다.


3

다음은 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)
}

2
제공하는 솔루션에 대한 설명을 조금 더 추가하여 답변을 더 자세히 설명해 주시겠습니까?
abarisone

이전 답변을 가져 와서 덮어 쓰기 옵션을 추가하여 개선했습니다.
Lou O.

3

이것은 또한 임시 폴더를 사용하지 않고 단일 파일을 압축 하고이 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기능을 사용하지 않고 더 짧고 빠른 방법을 사용했지만 함수도 좋아합니다 .
Charlie Joynt

2

이 스 니펫을 사용하여 데이터베이스 백업 폴더에서 아직 압축되지 않은 백업 파일을 확인하고 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 스크립트를 확인할 수 있습니다 .


2

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은 아카이브 내에 전체 디렉토리 경로를 작성하지 않습니다.


2

다음은 cmd.exe 또는 ssh 또는 원하는 항목에서 시작하는 완전한 명령 줄 예제입니다!

powershell.exe -nologo -noprofile -command "&{ Add-Type -A 'System.IO.Compression.FileSystem' [System.IO.Compression.ZipFile]::CreateFromDirectory('c:/path/to/source/folder/', 'c:/path/to/output/file.zip');}"

문안 인사


2

로딩 [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 오류를 포착하는 것입니다.


2

디렉토리 압축 및 추출을위한 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'); }"


-4

이 스크립트는 모든 디렉토리를 반복하고 각각을 압축합니다

Get-ChildItem-속성 d | foreach {write-zip $ .Name "$ ($ .Name) .zip"}


1
7 년 오래된 질문이 관련의 유일한 부분은 2009 년 허용 대답했다 "쓰기-ZIP"이었다
거부
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.