2016-09-22 3 views
1

Powershell을 사용하여 다음을 자동화하고 싶습니다. 1. 7 일이 지난 로그 파일 (.xml 및 .dat 확장자)의 압축, 2. 압축 된 아카이브 다른 곳에서 3. 원본 로그 파일을 원본에서 삭제합니다.Powershell을 사용하여 폴더 및 파일을 압축 한 다음 이전 파일을 삭제합니다.

나는 다양한 리소스에서 함께 뭉친 다음 Powershell 스크립트를 사용하고 있습니다. 이 파일 및 대상 폴더에 복사합니다을 아카이브로

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 
    } 
    } 

$targetFolder = 'C:\source' 
$destinationFolder = 'D:\destination\' 
$now = Get-Date 
$days = 7 
$lastWrite = $now.AddDays(-$days) 

Get-ChildItem $targetFolder -Recurse | Where-Object { $_ -is [System.IO.FileInfo] } | ForEach-Object { 
If ($_.LastWriteTime -lt $lastWrite) 
{ 
    $_ | New-Zip $($destinationFolder + $_.BaseName + ".zip") 
    $_ | Add-Zip $($destinationFolder + $_.BaseName + ".zip") 
} 
} 

Get-ChildItem $targetFolder -Recurse -Include "*.dat", "*.xml" | WHERE {($_.CreationTime -le $(Get-Date).AddDays(-$days))} | Remove-Item -Force 

이 스크립트는, 합리적으로 잘 작동 않습니다.

나는 C의 구조가있는 경우 : \ 소스 \ bigfolder \ logfile.dat, 폴더 구조를받지 않습니다 결과 zip 파일은 내가 좋아하는 것 같이

logfile.zip> bigfolder> 로그 파일을 대신

.DAT, 그냥 가져옵니다 logfile.zip> logfile.dat

수 이것을 알아내는 누군가의 도움이?

미세 조정을 더 잘 수행하려면 가능하면 특정 논리를 작성하여 특정 조건이 충족 될 때만 파일이 압축되도록하고 싶습니다. 내가 압축

원시 로그 파일은 다음과 같은 명명 루틴이 있습니다

Folders: 
    emstg#12_list\randomstring.xml 

Individual log files: 
    emstg#12_query_data.xml 
    emstg#12_events_cache.dat etc... 

이 파일의 시작 emstg 번호 번호와 동일 볼 수있다.

위의 스크립트에서 "이름 감지"메커니즘을 구현하는 방법은 무엇입니까?

감사

답변

0

당신이 [System.IO.Compression] 를 사용하여 폴더를 압축 할 수 나는 스크립트에 따라이를 썼다. 제 아이디어는 압축해야하는 파일의 전체 폴더 구조를 임시 폴더에 복사 한 다음 해당 임시 폴더를 압축하는 것입니다. 이름 탐지를 들어 , 당신은 또 다른 where-object

function Zip 
    { 
    param(
     [string]$source, 
     [string]$des 
    ) 
    add-type -AssemblyName System.IO.Compression.FileSystem 
    [System.IO.Compression.ZipFile]::CreateFromDirectory($source,$des,'Optimal',$true) 
    Start-sleep -s 1 
} 


$targetFolder = "C:\source" 
$destinationFolder = "C:\destination" 
$temp = "C:\temp" 
$now = Get-Date 
$days = 7 
$lastWrite = $now.AddDays(-$days) 
$i = 1 

Get-ChildItem $targetFolder -Recurse | Where-Object { $_ -is [System.IO.FileInfo] } | Where-Object {$_ -like "*.*"} | ForEach-Object { 
    If ($_.LastWriteTime -lt $lastWrite) { 
     $halfDir = $_.DirectoryName.Trim($targetFolder) 
     $s = $temp + "\" + $i + "\" + $halfDir 
     $d = $destinationFolder + "\" + $_.BaseName + ".zip" 
     Copy-Item $_.DirectoryName -Destination $s 
     Copy-Item $_.FullName -Destination $s 
     Zip -source $s -des $d 
     $i++ 
    } 
} 
+0

들으, 몇 가지 버그 나는 파일 이름의 시작 부분에 같은 이름 지정 규칙이있는 폴더와 파일을 여러 개있는 경우, 예를 들어,을 (당신이 원하는대로 코드를 수정)가 필요합니다 ** D : \ source \ emstg # 12 \ string.xml ** (폴더 및 파일) 및 개별 파일 : D : \ source \ emstg # 12_data.xml ** 또는 ** D : \ source \ emstg # 12_events.dat **, 비슷한 이름으로 인해 오류가 발생했습니다 : "4"인수로 "CreateFromDirectory"를 호출하는 예외 : "파일 'D : \ destination \ esmstg # 12.zip'이 (가) 이미 있습니다. * 임시 파일도 삭제되지 않습니다. 수정 된 코드는 다음과 같습니다 :'..... | Where-Object {$ _ -like "esmstg # 12 *"} | ForEach-Object {' ZIP은 같은 폴더/파일 구조를 유지해야합니다. – valdroni