powershell criar zip a partir de arquivos de log

0

Como posso mover arquivos de log para zipar arquivos com System.IO.Compression.FileSystem no PowerShell?

Eu tenho mais pastas com arquivos de log por aplicativo:

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

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

e assim por diante .. E eu quero processar esses arquivos em um arquivo zip por dia.

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
    
por gazsiazasz 09.05.2013 / 11:16

3 respostas

0

Não vejo por que você deseja mover os arquivos especificamente. Você sempre pode compactá-los, verificar se foi feito corretamente e remover os arquivos no final.

Para que isso funcione no Powershell, você precisa do .NET 4.5 CLR, já que essa classe é nova nessa versão.

# 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)

Se você obtiver Unable to find type [System.IO.Compression.ZipFile]: make sure that the assembly containing this type is loaded. após o último método, significa que você não tem o .NET 4.5 CLR instalado (ou o assembly errado foi carregado do GAC).

    
por 09.05.2013 / 13:59
0

Supondo que você tenha o .NET 4.5 CLR, use o método CreateEntryFromFile para criar seus arquivos zip, um arquivo de registro por vez.

    
por 09.05.2013 / 14:58
0

O uso do objeto Shell.Application eliminará os arquivos temporários. Além disso, você não precisa se preocupar se o NET 4.5 estiver instalado. Este objeto está disponível desde o Windows XP.

O código abaixo assume que você tem todas as suas pastas de log de aplicativo em uma única pasta. Ele procurará arquivos de log correspondentes à data (hoje), criará um arquivo zip e copiará os arquivos para ele. O arquivo zip também será nomeado de acordo com a data atual.

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

}

Minhas suposições podem estar erradas e você pode precisar fazer algumas alterações para que funcione no seu ambiente. O principal argumento deste exemplo é usar o objeto Shell.Application para criar arquivos zip.

    
por 13.05.2013 / 19:50