Powershell Script zum archivieren von Dateien?
Hallo,
ich versuche aktuell mittels Powershell Logfiles aus einem Ordner A in Zipdatei B zu archivieren. Das Script sollte monatlich einmal automatisiert laufen, sodass pro Monat eine Zipdatei entsteht, welche mit YYYY:MM:DD benannt wird. Wie verwirklicht man das als Skript oder hat schon einer so ein ähnliches Script?
MfG Tim
2 Antworten
...ohne weitere Worte
MyCompress,ps1
#hier Quelldateien angeben
#Du kannst auch meherere QuellPfade durch Komma getrennt angeben
#zB. $QuellDateien='C:\Users\Erzesel Secure\Desktop\*.log', 'C:\Users\Erzesel Secure\Desktop\jpg\*.jpg'
$QuellDateien='C:\Users\Erzesel Secure\Desktop\*.log'
$ZielOrdner='F:\ZipSammelordner'
#erzeuge den SammelOrdner, falls dieser noch nicht existiert
$ZielOrdner=New-Item -Path $ZielOrdner -ItemType Directory -force
#nakter Name des Zielarchives (ohne Pfad und Zeitstempel)
$ZielArchivName='Logs'
#pfad der Zieldatei erzeugen und mit Zeitstempel versehen
$ZielArchiv='{0}\{1}-{2}.zip' -f $ZielOrdner,$ZielArchivName,(Get-Date -Format "yyyyMMdd")
#Dateien ins Zip packen
Compress-Archive $QuellDateien -DestinationPath $ZielArchiv -update
pause
...kleiner Trick, da sich Powershellscripte nur selten ohne das "Aushebeln" von Ausführungsbestimmungen ausführen lassen, schreiben wir unser Powershellscript in eine Batchdatei, welche den Powershellcode ohne irgendwelche Umwege direkt ausführt.
(ansonsten das Gleiche wie oben.)
MyCompress.cmd
<# : Batch Abschnitt ,Batch sieht in dieser Zeile die Eingabe aus der Datei # an ein SprungLabel (also ignoriert den vermeintlichen Müll), Powershell sieht den begin eines Kommentars.
@echo off
rem startet Powershell und lässt den Inhalt dieser Batch als Scriptblock ausführen
powershell "iex(${%~f0}|out-string)"
exit /b
: Ende Batch
:: Ab der nächsten Zeile beginnt das eigentliche PowershellScript, da kannst Du Powershellcode einfügen wie es Dir beliebt......und damit ist der vermeintliche "Kommentar" zu ende: #>
#ab hier Dein PowershellCode...
$QuellDateien='C:\Users\Erzesel Secure\Desktop\*.log'
$ZielOrdner='F:\ZipSammelordner'
$ZielOrdner=New-Item -Path $ZielOrdner -ItemType Directory -force
$ZielArchivName='Logs'
$ZielArchiv='{0}\{1}-{2}.zip' -f $ZielOrdner,$ZielArchivName,(Get-Date -Format "yyyyMMdd")
Compress-Archive $QuellDateien -DestinationPath $ZielArchiv -update
Glossar:
- https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/get-date?view=powershell-5.1
- https://ss64.com/ps/syntax-f-operator.html
- https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.archive/compress-archive?view=powershell-5.1
- https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/new-item?view=powershell-5.1
- https://docs.microsoft.com/en-us/powershell/module/Microsoft.PowerShell.Utility/Invoke-Expression?view=powershell-5.1
$QuellDateien='C:\Users\Erzesel Secure\Desktop\*.log'
$ZielOrdner='F:\ZipSammelordner'
$ZielOrdner=New-Item -Path $ZielOrdner -ItemType Directory -force
$ZielArchivName='Logs'
$ZielArchiv='{0}\{1}-{2}.zip' -f $ZielOrdner,$ZielArchivName,(Get-Date -Format "yyyyMMdd")
# NEU: berücksichtige nur Dateien, welche innerhalb des letzten Monats geändert wurden: get-item $QuellDateien|?{$_.lastwritetime -ge (Get-Date).AddMonths(-1)}
# das Ergebniss übergeben wir über die Pipeline, da Compress-Archive zeimlich sauer reagiert, wenn nichts direkt im -Path parameter übergeben wird...
# über die Pipe wird das wohl geduldet? ...egal... klappt
Get-Item $QuellDateien|?{$_.lastwritetime -ge (Get-Date).AddMonths(-1)} | Compress-Archive -DestinationPath $ZielArchiv -update
Andere Optionen wären das jeweils letzte Ausführungsdatum in eine Datei oder die Registry zu speichern und dieses zum Vergleich heranzuziehen aber das erhöht den Aufwand.
... ?{$_.lastwritetime -ge (get-date).AddDays(-33)}
...würde einen Buffer von einigen Tagen mehr einräumen...(und kleinere mögliche Überschneidungen in Kauf nehmen). Das ist aber mehr oder weniger eine Sache dessen was man für besser erachtet.
update:
Habe einen Fehler gefunden. wenn die Pipeline leer ist, wird (warum auch immer?) eine bestehende Zipdatei gelöscht. (sollte beim Parameter -Update eigentlich nicht sein)
Fix: vorher abfragen, ob $QuellDateien nicht Leer ist...
$QuellDateien='C:\Users\Erzesel Secure\Desktop\TestFolder\*.log'
$ZielOrdner='F:\ZipSammelordner'
$ZielOrdner=New-Item -Path $ZielOrdner -ItemType Directory -force
$ZielArchivName='Logs'
$ZielArchiv='{0}\{1}-{2}.zip' -f $ZielOrdner,$ZielArchivName,(Get-Date -Format "yyyyMMdd")
$QuellDateien=Get-Item $QuellDateien|?{$_.lastwritetime -ge (Get-Date).AddMonths(2)}
if ($QuellDateien) {
Compress-Archive $QuellDateien -DestinationPath $ZielArchiv -update
}
else {
'Keine Dateien zum Archivieren...'
}
Script erstellen und dann in der Aufgabenplanung als monatlichen Task hinterlegen.
Zum Zippen
Compress-Archive
[-Path] <String[]>
[-DestinationPath] <String>
[-CompressionLevel <String>]
-Force
[-PassThru]
[-WhatIf]
[-Confirm]
[<CommonParameters>]
Die Datei einfach mithilfe von Get-Date entsprechend benennen.
Danke! Funktioniert wunderbar :)
Eine Frage hätte ich allerdings noch: Wie müsste ich das Script verändern, dass immer nur die monatlichen Dateien in dem Monatsarchiv landen und nicht auch die vom vorherigen Monat?