2012-01-11 12 views
1

\\server\logsには、一貫したファイル命名規則に従わないアーカイブログファイルを含むサブディレクトリのツリーがあります。非圧縮ファイルを90日前またはそれ以前の日時のzipファイルに圧縮するために、毎日のスケジュールされたタスクを実行したいと思います。私は各ジップ内にディレクトリツリー構造とファイル名を維持したいと思います。Powershellのログファイルを日付でフィルタリングします

Powershellでこれにアプローチするにはどうすればよいですか?

EDIT:より良いアプローチがない限り、私はzipファイルを\\server\oldlogsで作成し、特定の日に名前を付けるべきだと思います。 \\server\oldlogs\20110630_logs.zip。 90日以上前に最後に変更された\\server\logsのすべてのファイルは、適切な.zipファイルに追加する必要があります。

+0

日付フィルタはこのような何かを行くことができます。これらのサブディレクトリには、.zipで終わらないファイルが含まれます。このプロセスは、過去90日間に作成されていない(作成/変更/アクセスされていない)すべてのファイルを識別し、それらを既存のディレクトリ構造の.zipに入れる必要があります。アーカイブファイルを作成したら、それらのファイルを削除する必要があります。正確? – billinkc

+0

@billinkc - これで言及しましたが、 '\\ server \ oldlogs'ディレクトリにzipを作成するほうが簡単です。私はその日に最後に変更されたファイルを含む1日の名前のzipファイルで終わりたい。その後、はい、一度圧縮されたら、削除する必要があります。私は質問を更新します。ありがとう。 –

+0

なぜpowershellタグを使用しますか?問題または機能スクリプトに関する意見が必要ですか? – mjsr

答えて

0

ここには66%の解決策(昼食は終わっています)があります。私はPowerShellので動作するネイティブジップを取得できませんでしたが、あなたはPowerShellのコミュニティの拡張機能がインストールされている場合、ジップコールを交換するためにスナップする必要があります How to create a zip archive with PowerShell?

# purloined from http://blogs.inetium.com/blogs/mhodnick/archive/2006/08/07/295.aspx 
# I am not smart enough to make it work. Creates an empty .zip file for me 
Function ZipIt 
{ 
    param 
    (
     [string]$path 
    , [string]$files 
    ) 

    if (-not $path.EndsWith('.zip')) {$path += '.zip'} 

    if (-not (test-path $path)) { 
     set-content $path ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18)) 
    } 

    $zipFile = (new-object -com shell.application).NameSpace($path) 
    #$files | foreach {$zipfile.CopyHere($_.fullname)} 
    foreach($file in $files) 
    { 
     $zipfile.CopyHere($file) 
    } 
} 

# this script is reponsible for enumerating subfolders 
# for each file it finds, it will test the age on it 
# returns an array of all the files meeting criteria 
Function Walk-SubFolder 
{ 
    param 
    (
     [string]$RootFolder 
    ) 

    $searchPattern = "*.*" 
    $maxAge = 90 
    $now = Get-Date 

    # receiver for the files 
    [string[]] $agedOutFileList = @() 

    foreach($file in [System.IO.Directory]::GetFiles($RootFolder, $searchPattern, [System.IO.SearchOption]::AllDirectories)) 
    { 
     # test whether the file meets the age criteria 
     $age = [System.IO.File]::GetLastWriteTime($file) 
     $days = ($now - $age).Days 
     if (($now - $age).Days -ge $maxAge) 
     { 
      # this needs to be archived 
      Write-Host("$file is aged $days days") 
      $agedOutFileList = $agedOutFileList + $file 
     } 
    } 

    return $agedOutFileList 
} 

Function PurgeFiles 
{ 
    param 
    (
     $fileList 
    ) 
    foreach($file in $fileList) 
    { 
     # this should be in a try/catch block, etc, etc 
     [System.IO.File]::Delete($file) 
    } 
} 

$sourceFolder = "C:\tmp\so" 
$zipFile = "C:\tmp\so.zip" 


$oldFiles = Walk-SubFolder $sourceFolder 
ZipIt $zipFile $oldFiles 

#This is commented out as the zip process is not working as expected 
#PurgeFiles $oldFiles 

私が働くことができるならば、私が表示されます後でジッパーを期待どおりに動作させることができます。

+0

これは面白いです。 90日以上経過したすべてのファイルが、最後の書き込み日に対応するzipファイルではなく、同じzipファイルに追加されるという点ではまったく正しいわけではありません。私はこれにも適応できると思う。 –

+0

また、ZipItは完全修飾パスを含めて追加する予定ですか? –

0

.NET 3以降、System.IO.Packaging.ZipPackageは圧縮を実行できます。サブフォルダはthis exampleにはありませんが、処理できるのはapparentlyです。 \\サーバー\サブディレクトリがあるlogsに

$ninetyDaysAgo = (get-date).adddays(-90) 
$Files | where {$_.lastWriteTime -lt $ninetyDaysAgo} 
関連する問題