2016-09-22 5 views
1

Ich möchte mit Powershell automatisieren: 1. Komprimierung von Protokolldateien (XML und .dat Erweiterungen) älter als 7 Tage, 2. Kopieren Sie diese komprimierten Archiven woanders und 3. Löschen Sie dann die rohen Protokolldateien aus der Quelle.Powershell zum Zip-Ordner und Dateien, dann löschen alte Dateien

Ich verwende das folgende Powershell-Skript, das ich aus verschiedenen Quellen zusammengefügt habe.

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 

Dieses Skript recht gut funktioniert, wie es nur die Dateien archiviert, und kopiert sie auf den Zielordner.

Wenn ich eine Struktur von C: \ source \ bigfolder \ logfile.dat, die sich ergebende Zip-Datei wird nicht die Ordnerstruktur erhalten, wie ich möchte:

logfile.zip> bigfolder> Logfile .dat

Stattdessen wird es nur: logfile.zip> logfile.dat

kann jemand helfen dies herauszufinden?

Um es noch besser zu optimieren, möchte ich, wenn möglich, einige Logik erstellen, so dass die Dateien nur komprimiert werden, wenn ein bestimmtes Kriterium erfüllt ist.

Die Raw-Log-Dateien, die ich habe eine Namens Routine wie folgt komprimieren:

Folders: 
    emstg#12_list\randomstring.xml 

Individual log files: 
    emstg#12_query_data.xml 
    emstg#12_events_cache.dat etc... 

Wie Sie der Beginn dieser Dateien sehen können mit emstg # Nummer gleich ist.

Wie implementiert man einen Mechanismus zur "Namenserkennung" im obigen Skript?

Dank

Antwort

0

Sie einen Ordner mithilfe [System.IO.Compression] ich diese zip könnte schrieb das Skript basiert. Meine Idee ist es, die gesamte Ordnerstruktur der zu komprimierenden Datei in einen temporären Ordner zu kopieren und dann den temporären Ordner zu komprimieren. Für die Namenserkennung, müssen Sie nur ein weiterer where-object (den Code ändern, wie Sie wollen)

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, einige Fehler Wenn ich am Anfang des Dateinamens einen Ordner und mehrere Dateien mit dem gleichen Namenskonvention, z.B. ** D: \ source \ emstg # 12 \ string.xml ** (Ordner & Datei) und dann einzelne Dateien: ** D: \ source \ emstg # 12_data.xml ** oder ** D: \ source \ emstg # 12_events.dat **, es gibt einen Fehler wegen ähnlichen Namens: ** Ausnahme beim Aufruf von "CreateFromDirectory" mit "4" Argument (en): "Die Datei 'D: \ destination \ esmstg # 12.zip' existiert bereits." * * Temporäre Dateien werden auch nicht gelöscht. Der modifizierte Code lautet: '..... | Where-Objekt {$ _ -like "esmstg # 12 *"} | ForEach-Object {' Die ZIP sollte die gleiche Ordner/Dateistruktur behalten – valdroni

Verwandte Themen