programing

Powershell 또는 명령줄을 사용하여 Windows에서 압축/지핑된 폴더 만들기

testmans 2023. 8. 28. 20:52
반응형

Powershell 또는 명령줄을 사용하여 Windows에서 압축/지핑된 폴더 만들기

야간 데이터베이스 스키마 파일을 작성하고 있으며 각 데이터베이스에 대해 매일 밤 작성된 모든 파일을 폴더에 넣고 해당 폴더를 압축하려고 합니다.스키마를 생성하는 PowerShell 스크립트가 있습니다.DB의 작성 스크립트만 작성한 다음 모든 파일을 새 폴더에 추가합니다.문제는 이 프로세스의 압축 부분에 있습니다.

폴더 압축을 처리하는 사전 설치된 Windows 유틸리티로 이 작업을 수행할 수 있는지 아는 사람이 있습니까?

7zip과 같은 유틸리티보다는 가능하면 해당 유틸리티를 사용하는 것이 가장 좋습니다(모든 고객의 서버에 7zip을 설치하고 싶지 않고 요청하면 몇 년이 걸릴 수도 있습니다).

최신 버전의 네이티브 방식입니다.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") ;

언급한 것처럼, 기능이 전혀 없으므로 덮어쓰기 플래그를 예상하지 마십시오.

다음은 확장자에 의존하지 않는 몇 가지 zip 관련 기능인 Windows PowerShell로 파일 압축입니다.

관심을 가질 수 있는 주요 기능은 다음과 같습니다.

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 c:\demo\files\*.* -Recurse | Add-Zip c:\demo\myzip.zip

한 가지 주의할 점이 있습니다.shell.application물건의NameSpace()경로가 절대적이지 않으면 zip 파일을 쓰기 위해 열지 못합니다.그래서, 만약 당신이 상대적인 경로를 통과했다면.Add-Zipnull 오류로 인해 실패하므로 zip 파일의 경로는 절대 경로여야 합니다.

또는 그냥 추가할 수 있습니다.$zipfilename = resolve-path $zipfilename함수의 시작 부분에서.

PowerShell 5부터는 즉시 작업을 수행하는 Compress-Archive cmdlet이 있습니다.

.\in 컨텐츠를 .\out.zip으로 압축합니다.IO.포장.다음 예제에 따른 Zip 패키지

$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()

파워셸에서 파일을 압축하기 위해 Voitos의 응답을 사용했는데, Add-Zip 기능에 한 가지 문제가 있었습니다. Start-sleep-milliseconds 500은 그 시간 내에 파일이 완전히 압축되지 않으면 문제가 발생했습니다. -> 완료되기 전에 시작한 다음 파일은 오류와 일부 파일이 압축되지 않았습니다.

그래서 잠시 장난을 친 후, 먼저 카운터에서 $zipPackage의 개수를 확인하려고 합니다.항목()과 항목 수가 증가한 후에만 계속됩니다(그렇지 않아야 할 경우에는 0을 반환하기 때문에 작동하지 않습니다). 패키지가 여전히 파일을 압축/복사하고 있으면 0을 반환한다는 것을 발견했습니다(내 생각에는 0을 반환합니다.zipPackage를 기다리며 내부에 시작-슬립이 포함된 간단한 while 루프를 추가했습니다.계속하기 전에 항목(.)이 0이 아닌 값으로 카운트되므로 문제가 해결된 것 같습니다.

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)
        do
        {
            Start-sleep -milliseconds 250
        }
        while ($zipPackage.Items().count -eq 0)
}
}

PowerShell 버전 3.0 사용:

Copy-ToZip -File ".\blah" -ZipFile ".\blah.zip" -Force

이게 도움이 되길 바랍니다.

언급URL : https://stackoverflow.com/questions/11021879/creating-a-zipped-compressed-folder-in-windows-using-powershell-or-the-command-l

반응형