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