Архивирование файлов журналов в Powershell с фильтрацией по дате - PullRequest
1 голос
/ 11 января 2012

Под \\server\logs есть дерево подкаталогов, которые содержат архивные файлы журналов, которые не соответствуют согласованному соглашению об именах файлов. Я хотел бы запустить ежедневную запланированную задачу, чтобы заархивировать не заархивированные файлы с 90 дней или ранее в ежедневные заархивированные файлы. Я хочу сохранить структуру дерева каталогов и имена файлов внутри каждого почтового индекса.

Как лучше всего подойти к этому в Powershell?

РЕДАКТИРОВАТЬ: Если нет лучшего подхода, я думаю, что zip-файлы должны быть созданы в \\server\oldlogs и называться для определенного дня, например. \\server\oldlogs\20110630_logs.zip. Все файлы в \\server\logs, которые были последний раз изменены более 90 дней назад, должны быть добавлены в соответствующий файл .zip.

Ответы [ 2 ]

0 голосов
/ 10 марта 2013

Из .NET 3, System.IO.Packaging.ZipPackage может выполнять сжатие.В этом примере нет подпапок , но они могут обрабатываться , по-видимому .

Фильтр даты может выглядеть примерно так:

$ninetyDaysAgo = (get-date).adddays(-90)
$Files | where {$_.lastWriteTime -lt $ninetyDaysAgo}
0 голосов
/ 11 января 2012

Вот 66% решение (обед окончен).Я не смог заставить собственный zip-файл работать с PowerShell, но если у вас установлены PowerShell Community Extensions, достаточно просто заменить zip-вызов Как создать ZIP-архив с 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

Я посмотрю, смогу ли я поработать над этим позже, чтобы заставить почтовый индекс работать как положено.

...