Как я могу переместить файлы журнала в zip-архивы с помощью системы.IO.Compression.Файловая система в PowerShell?

У меня есть больше папок с файлами журналов для каждого приложения:

app1logfolder
|-app1_20130507.log
|-app1_20130508.log
|-app1_20130509.log

app2logfolder
|-app2_20130507.log
|-app2_20130508.log
|-app2_20130509.log

и так далее.. И я хочу обрабатывать эти файлы в ZIP-архиве в день.

logs_20130507.zip
|-app1_20130507.log
|-app2_20130507.log

logs_20130508.zip
|-app1_20130508.log
|-app2_20130508.log

logs_20130509.zip
|-app1_20130509.log
|-app2_20130509.log

3 ответа3

0

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

Чтобы это работало в Powershell, вам нужен .NET 4.5 CLR, так как этот класс является новым в этой версии.

# load the assembly required
[Reflection.Assembly]::LoadWithPartialName("System.IO.Compression.FileSystem")
$sourceFolder = "C:\Path\To\Your\Logs"
$destinationFile = "C:\Path\To\Your\Destination.zip"    
# desired compression level (Optimal, Fastest or NoCompression)
$compressionLevel = [System.IO.Compression.CompressionLevel]::Optimal
# include the directory $sourceFolder or just it's contents
$includeBaseDirectory = $false

[System.IO.Compression.ZipFile]::CreateFromDirectory($sourceFolder, $destinationFile, $compressionLevel , $includeBaseDirectory)

Если вы Unable to find type [System.IO.Compression.ZipFile]: make sure that the assembly containing this type is loaded. после последнего вызова метода это означает, что у вас не установлена .NET 4.5 CLR (или из GAC загружена неправильная сборка).

0

Предполагая, что у вас есть .NET 4.5 CLR, вы хотите использовать метод CreateEntryFromFile для создания ваших zip-файлов по одному файлу журнала за раз.

0

Используя Shell.Объект приложения покончит с временными файлами. Кроме того, вам не нужно беспокоиться, если установлена NET 4.5. Этот объект доступен начиная с Windows XP.

В приведенном ниже коде предполагается, что все папки журналов приложений находятся в одной папке. Он будет искать файлы журналов, соответствующие дате (сегодня), создаст zip-файл и скопирует файлы в него. Почтовый файл будет назван в соответствии с текущей датой.

$date_string = Get-Date -Format 'yyyyMMdd'

$zip_filename = "logs_$date_string.zip"

# Create the empty zip file
Set-Content $zip_filename ( [byte[]] @( 80, 75, 5, 6 + (, 0 * 18 ) ) ) -Encoding Byte

$zip_file = Get-Item -Path $zip_filename | ForEach-Object { 

    (New-Object -ComObject Shell.Application).NameSpace($_.FullName) 
}

[array]$log_files = Get-ChildItem -Recurse -Filter "*_$date_string.log"

for ($i=1; $i -le $log_files.Count; $i++) {

    $zip_file.CopyHere($log_files[$i-1].FullName)

    # Copying is async so we need to check if it is done before continuing.
    while ($zip_file.Items().Count -ne $i) { sleep 0.1 }

}

Мои предположения могут быть неверными, и вам может потребоваться внести некоторые изменения, чтобы это работало в вашей среде. Ключевым выводом из этого примера является использование оболочки.Объект приложения для создания zip-файлов.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .