Ich habe ein Problem, für das ich im Internet keine passende Lösung finden konnte. Zwar gibt es Artikel zu ähnlichen Problemen, aber die vorgeschlagenen Lösungen haben entweder Fehler nicht berücksichtigt oder die Zip-Dateien immer nur an einem festen Ort entpackt. Deshalb habe ich beschlossen, ein eigenes Skript zu erstellen, das folgende Aufgaben erfüllen soll:
- Es soll alle Zip- und Rar-Dateien entpacken.
- Die Dateien sollen immer in einem Ordner mit dem Namen der entsprechenden Zip-/Rar-Datei entpackt werden, der sich im selben Verzeichnis befindet.
- Fehler sollen ignoriert werden.
- Bei erfolgreichem Entpacken soll die ZIP-Datei gelöscht werden.
Ich habe ein Powershell-Skript geschrieben, das durch die Variable startPath
angibt, welches Verzeichnis als Root-Verzeichnis dienen soll:
$startPath = "D:\Public"
Das Skript trägt den Namen entpacken_rekursiv.ps1
, kann aber beliebig umbenannt werden, solange die Dateiendung .ps1
beibehalten wird. Im folgenden Block wird der Code des Programms dargestellt:
# Define the path to start the search
$startPath = "D:\Public"
# Set up the PowerShell compression module
Import-Module Compression
# Search for ZIP and RAR files recursively
$zipFiles = Get-ChildItem -Path $startPath -Recurse -Filter "*.zip"
$rarFiles = Get-ChildItem -Path $startPath -Recurse -Filter "*.rar"
# Loop through the ZIP files and extract them
foreach ($zipFile in $zipFiles)
{
# Check if the destination directory already exists
$destinationDirectory = Join-Path -Path $zipFile.DirectoryName -ChildPath $zipFile.BaseName
if (-Not (Test-Path -Path $destinationDirectory))
{
# Create the destination directory
New-Item -ItemType Directory -Path $destinationDirectory | Out-Null
}
# Extract the ZIP file, ignoring errors and passwords, and overwriting existing files
Expand-Archive -LiteralPath $zipFile.FullName -DestinationPath $destinationDirectory -ErrorAction SilentlyContinue -Force
# Delete the ZIP file
Remove-Item -Path $zipFile.FullName -Force
# Log the extraction
Write-Output "Extracted ZIP file $($zipFile.FullName) to $destinationDirectory"
}
# Loop through the RAR files and extract them
foreach ($rarFile in $rarFiles)
{
# Check if the destination directory already exists
$destinationDirectory = Join-Path -Path $rarFile.DirectoryName -ChildPath $rarFile.BaseName
if (-Not (Test-Path -Path $destinationDirectory))
{
# Create the destination directory
New-Item -ItemType Directory -Path $destinationDirectory | Out-Null
}
# Extract the RAR file, ignoring errors and passwords, and overwriting existing files
Expand-Archive -LiteralPath $rarFile.FullName -DestinationPath $destinationDirectory -ErrorAction SilentlyContinue -Force
# Log the extraction
Write-Output "Extracted RAR file $($rarFile.FullName) to $destinationDirectory"
}
Es gibt eine weitere Möglichkeit, das Skript zu erweitern. Wenn man regelmäßig Zip-Dateien an einem bestimmten Ort ablegt, kann man in Windows einen Auftrag erstellen, der das Skript automatisch ausführt, z. B. jedes Mal, wenn der Computer neu gestartet wird. Allerdings sollte man dabei die Auswirkungen auf die Systemleistung berücksichtigen.
Um einen solchen Auftrag in Windows zu erstellen, sucht man einfach nach „Aufgabenplanung“. Eine detaillierte Anleitung findet man in diesem externen Artikel. Es ist jedoch wichtig zu beachten, wie man ein Powershell-Skript in Aufgabenplanung startet. Dabei gibt es zwei Besonderheiten:
- Unter „Programm/Script“ muss der Pfad zur Powershell-Exe von Windows angegeben werden, der sich normalerweise unter
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
befindet. - Zweitens muss das Argument
-command
verwendet werden, um den Pfad zum Powershell-Skript anzugeben. Zum Beispiel:-command "D:\Public\entpacken_rekursiv.ps1"
.
Hier noch ein Bild wie es aussehen könnte: