2012-06-13 3 views
23

야간 데이터베이스 스키마 파일을 만들고 매일 밤 생성 된 모든 파일을 각 데이터베이스에 하나씩 폴더에 저장하고 해당 폴더를 압축하려고합니다. 나는 데이터베이스의 schema.Only 작성 스크립트를 작성한 PowerShell 스크립트를 가지고 있으며 모든 파일을 새 폴더에 추가합니다. 문제는이 프로세스의 압축 부분에 있습니다.Powershell 또는 명령 줄을 사용하여 Windows에서 압축/압축 폴더 만들기

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

7zip과 같은 것보다는 가능하면 해당 유틸리티를 사용하는 것이 가장 좋습니다 (모든 고객의 서버에 7zip을 설치하는 것이 좋지 않으며 요청할 경우 IT 할 년이 소요될 수 있음).

+0

나는 이것이 당신의 선택을 설명한다고 생각한다 : http://richardspowershellblog.wordpress.com/2007/06/02/powershell-and-compressed-files/ – David

+1

대단히 감사합니다! 이것은 깨끗하고 쉬운 해결책이었습니다. 이 스레드에 걸려 넘어 질 수있는 다른 사람을위한 지시. http://pscx.codeplex.com/downloads 파일을 추출한 다음 디렉토리를 C : \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ Modules로 이동합니다. 그런 다음 다음 명령을 실행하여 모듈을 가져옵니다. Import-Module Pscx – TechDawg270

답변

19

다음은 확장 기능에 의존하지 않는 몇 가지 우편 관련 기능입니다. Compress Files with 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-Zip으로 전달하면 null 오류로 실패하므로 zip 파일의 경로는 절대적이어야합니다.

또는 기능 시작 부분에 $zipfilename = resolve-path $zipfilename을 추가하기 만하면됩니다.

+0

이 작업을 수행 했으므로시기 적절한 응답을 보내 주시면 감사하겠습니다. PowerShell 커뮤니티 확장을 다운로드하여 설치하고 Write-Zip 커맨드 렛을 사용할 수 있다고 생각하는 것이 더 쉽습니다. 기능을 달성하는 방법. – TechDawg270

+0

@ TechDawg270 : 동의 함 - 대부분 방금 게시했습니다. – voithos

3

이 압축합니다. \ 내용에에. \ out.zip System.IO.Packaging.ZipPackage으로 다음 예제 here

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

한 문제가 있었다, zip 파일 최대 PowerShell의에 voithos '대답 사용 Add-Zip 기능으로 Start-sleep-milliseconds 500은 파일이 그 시간에 완전히 압축 될 수없는 경우 문제를 일으켰습니다.> 완료되기 전에 시작한 다음 파일은 오류를 일으키고 일부 파일은 압축되지 않았습니다.

그래서 조금 놀아본 후, 카운터가 $ zipPackage.Items()의 수를 확인하고 아이템 수를 늘린 후에 만 ​​계속하려고하면 (0이 반환 될 때 작동하지 않음) 어떤 경우에는하지 말아야 할 것) 패키지가 여전히 압축/복사중인 경우 0을 반환한다는 것을 알았습니다 (필자는 생각합니다, 하하). 계속 시작하기 전에 zipPackage.Items(). count가 0이 아닌 값이 될 때까지 기다리는 동안 start-sleep이있는 간단한 while 루프가 추가되었습니다. 그러면 문제가 해결 될 것입니다. PowerShell을 버전 3.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) 
} 
} 
-3

:이 도움이

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

희망.

+4

이것은 PowerShell 3 cmdlet가 아닙니다. –

21

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

, 완전히 덜 기능, 그래서 플래그를 덮어 기대하지 않습니다.

+1

이것은 우아합니다. – deepelement

+0

이 솔루션으로 접근 경로가 거부되었습니다 :(강제로 할 생각이 있습니까? – Jerome2606

+0

@ Jerome2606 ... 경로에 액세스 할 수 있도록 설정하십시오. 또한 "덮어 쓰기 플래그가 필요하지 않습니다" – sonjz

4

PowersShell 5부터는 상자에서 작업을 수행하는 Compress-Archive cmdlet가 있습니다.

관련 문제