2016-09-22 37 views
1

Powershellを使用して自動化する: 1.ログファイル(.xmlと.dat拡張子)の圧縮を7日より後にする 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

Thxを、いくつかのバグ が必要D:\ source \ emstg#12_data.xml **またはD:\ source \ emstg#D:\ source \ emstg#12 \ string.xml(フォルダとファイル) 12_events.dat **、似たような名前のためにエラーが発生しました: "4"引数を指定して "CreateFromDirectory"を呼び出す例外: "ファイル 'D:\ destination \ esmstg#12.zip'は既に存在します。 *一時ファイルも削除されません。 変更されたコードは: '..... | Where-Object {$ _ -like "esmstg#12 *"} | ForEach-Object {' ZIPは同じフォルダ/ファイル構造を保持する必要があります – valdroni

関連する問題