Powershell Script zum archivieren von Dateien?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

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

Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren

AktiverBoyyy 
Fragesteller
 18.10.2020, 22:45

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?

0
Erzesel  19.10.2020, 04:59
@AktiverBoyyy
$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.

0
Erzesel  19.10.2020, 05:54
@AktiverBoyyy

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...'
}
0

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.