PowerShell-Skript für den Grundsteuer-Workflow

Ausgangssituation

Stell dir vor, du bist Sachbearbeiter*in für Grundsteuer und müsstest regelmäßig aus dem Elsterportal viele einzelne Datensätze herunterladen, die für die weitere Verarbeitung in einem Verzeichnis gesammelt werden. Doch bevor die Dateien tatsächlich im Fachverfahren importiert werden können, müssen sie noch einige Anpassungen durchlaufen.

Der Workflow sieht dabei wie folgt aus:

  1. Datensätze vom Portal holen: Diese werden als ZIP-Dateien heruntergeladen und in einem Ordner gespeichert.
  2. Umbenennung und Entpackung: Bestimmte Dateien müssen umbenannt und entpackt werden, damit das Fachverfahren die Daten korrekt einlesen kann.
  3. Endablage: Die vorbereiteten Dateien werden schließlich in das Zielverzeichnis kopiert, wo sie für das Fachverfahren bereitstehen.

Für diese Aufgaben bietet sich PowerShell perfekt an. Im Folgenden stelle ich euch das PowerShell-Skript vor, das alle Schritte für diesen Prozess abdeckt. Das Skript liegt dabei auf einem USB-Stick, sodass auch die Datenspeicherung und die Bearbeitung bequem darauf durchgeführt werden kann.

Das PowerShell-Skript im Überblick

Das Skript gliedert sich in vier wesentliche Schritte:

  1. Kopieren der Quelldateien: Zuerst werden alle ZIP-Dateien aus einem Ursprungsverzeichnis auf den USB-Stick kopiert.
  2. Datei- und Format-Anpassungen: Die Dateien werden nach bestimmten Regeln umbenannt.
  3. Entpacken: Die ZIP-Archive werden entpackt.
  4. Verschieben der Dateien ins Zielverzeichnis: Die entpackten Dateien werden schließlich ins Endzielverzeichnis für das Fachverfahren kopiert.

Hier ist das vollständige Skript:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
<pre class="enlighter-clipboard"># MIT License
#
# Copyright (c) 2024 Markus Pooch
#
#
# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
# files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,
# modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software 
# is furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR 
# IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


# Lade das benötigte Assembly für die ZIP-Verarbeitung
Add-Type -Path "C:\Windows\Microsoft.NET\Framework64\v4.0.30319\System.IO.Compression.FileSystem.dll"

# Verzeichnisse definieren
$sourcePath = "Pfad\zum\Verzeichnis\mit\den\Zips" # USBVerzeichnis mit den ZIP-Dateien anpassen
$destinationPath = "Pfad\zum\Zielordner" # USBZielverzeichnis für das Entpacken anpassen
$initialSource = "Pfad\Downloadordner\mit\den\Dateien" # Ursprungsverzeichnis der Dateien
$finalDestination = "Pfad\Zielverzeichnis\Fachverfahrensimporter" # Endzielverzeichnis für die entpackten Dateien

# Schritt 0: Dateien aus initialem Verzeichnis in den Source-Path kopieren
Write-Output "Kopiere Dateien von '$initialSource' nach '$sourcePath'..."
Copy-Item -Path "$initialSource\*" -Destination $sourcePath -Recurse -Force

# Variable zur Gesamtsumme der Dokumente
$totalDocumentCount = 0

# Schritt 1: Dateien umbenennen
Write-Output "`nUmbenennen der Dateien..."
# .pdf.zip in _pdf.zip umbenennen
Get-ChildItem -Path $sourcePath -Filter *.pdf.zip | ForEach-Object {
$newName = $_.Name -replace '\.pdf\.zip$', '_pdf.zip'
Rename-Item -Path $_.FullName -NewName $newName
}

# .ndatei in .zip umbenennen
Get-ChildItem -Path $sourcePath -Filter *.ndatei | ForEach-Object {
$newName = $_.Name -replace '\.ndatei$', '.zip'
Rename-Item -Path $_.FullName -NewName $newName
}

# Schritt 2: Anzahl der Dokumente in jedem ZIP-Archiv zählen
Write-Output "`nAnzahl der Dokumente in jedem ZIP-Archiv:"
Get-ChildItem -Path $sourcePath -Filter *.zip | ForEach-Object {
$zipFile = $_.FullName
$zipArchive = [System.IO.Compression.ZipFile]::OpenRead($zipFile)
$fileCount = $zipArchive.Entries.Count
$zipArchive.Dispose()

# Addiere die Anzahl der Dateien zur Gesamtsumme
$totalDocumentCount += $fileCount

# Ausgabe der Anzahl der Dateien im aktuellen ZIP-Archiv
Write-Output "Datei '$($_.Name)' besitzt $fileCount Dokumente."
}

# Gesamtsumme der Dokumente ausgeben
Write-Output "`nGesamtanzahl der Dokumente in allen ZIP-Dateien: $totalDocumentCount"

# Schritt 3: Entpacken aller ZIP-Dateien in das Zielverzeichnis
Write-Output "`nEntpacken der ZIP-Dateien in das Zielverzeichnis..."
Get-ChildItem -Path $sourcePath -Filter *.zip | ForEach-Object {
Expand-Archive -Path $_.FullName -DestinationPath $destinationPath -Force
}

# Schritt 4: Kopiere entpackte Dateien ins finale Zielverzeichnis
Write-Output "`nKopiere entpackte Dateien von '$destinationPath' nach '$finalDestination'..."
Copy-Item -Path "$destinationPath\*" -Destination $finalDestination -Recurse -Force

# Fertig-Meldung und Fenster offen halten
Write-Output "`nFertig!"
Read-Host -Prompt "Druck auf Enter, um das Fenster zu schließen"</pre>

Erläuterung der Schritte im Detail

Schritt 0: Quelldateien auf den USB-Stick kopieren

Im ersten Schritt wird mit `Copy-Item` der Inhalt des Ursprungsverzeichnisses auf den Stick (hier `$sourcePath`) kopiert. Der Befehl `-Recurse` sorgt dafür, dass auch alle Unterverzeichnisse und deren Inhalte kopiert werden. Mit `-Force` wird das Kopieren auch dann durchgeführt, wenn Dateien mit demselben Namen bereits vorhanden sind.

Schritt 1:Dateien umbenennen

Im ersten Schritt gibt es zwei Anpassungen:

  1. Umbenennung von `.pdf.zip` auf `_pdf.zip`: Hier wird der `Rename-Item`-Befehl mit einem regulären Ausdruck genutzt, um alle Dateien mit der Endung `.pdf.zip` in `_pdf.zip` umzubenennen.
  2. Umbenennung von `.ndatei` auf `.zip`: Der zweite Block kümmert sich um Dateien, die ursprünglich als `.ndatei` gespeichert wurden, und ändert deren Endung in `.zip`. So können sie im nächsten Schritt problemlos entpackt werden.

Schritt 2: Dateien zählen

Bevor es ans Umbenennen und Entpacken geht, prüft das Skript die Anzahl der Dateien in jedem ZIP-Archiv. Jede ZIP-Datei wird über die `System.IO.Compression.ZipFile`-Klasse geöffnet, und deren `Entries.Count` liefert die Anzahl der darin enthaltenen Dateien. Die Anzahl wird aufsummiert und am Ende ausgegeben.

Schritt 3: Entpacken der ZIP-Dateien

Alle ZIP-Dateien werden mit dem `Expand-Archive`-Befehl in das Zielverzeichnis (`$destinationPath`) entpackt. Der Parameter `-Force` sorgt dafür, dass bereits vorhandene Dateien im Zielverzeichnis überschrieben werden.

Schritt 4: Verschieben der entpackten Dateien ins Endzielverzeichnis

Mit `Copy-Item` werden die entpackten Dateien abschließend vom Stick in das finale Zielverzeichnis (`$finalDestination`) kopiert, wo das Fachverfahren dann Zugriff auf die vorbereiteten Daten hat.

Fertigmeldung

Am Ende gibt das Skript eine Meldung aus und bleibt geöffnet, bis Enter gedrückt wird. Dies ermöglicht es, das Ergebnis nochmal zu überprüfen, bevor das Fenster geschlossen wird.

Zusammenfassung

Dieses Skript vereinfacht den Prozess, Daten aus dem Elsterportal herunterzuladen, sie umzubenennen und für den Import in ein Fachverfahren vorzubereiten. Die verschiedenen Schritte sind so ausgelegt, dass sie auch problemlos von einem USB-Stick aus durchgeführt werden können, was Flexibilität bei der Bearbeitung und Datenverarbeitung bietet.

 

Wie immer gibt es das auch auf meinem Codeberg Git Repository

Schreibe einen Kommentar