8 Stimmen

Wie komprimiere ich mehrere Dateien zu einer Zip-Datei mit PowerShell?

Ich möchte mehrere Dateien zu einer Zip-Datei komprimieren.

Ich stecke gerade hier fest:

Get-ChildItem -path C:\logs -Recurse | Where {$_.Extension -eq ".csv" -and $_.LastWriteTime -lt (Get-Date).AddDays(-7)} | write-zip -level 9 -append ($_.LastWriteTime).zip | move-item -Force -Destination {
    $dir = "C:\backup\archive"
    $null = mkdir $dir -Force
    "$dir\"
}

Ich erhalte diese Ausnahme

Write-Zip: Kann Argument für Parameter 'Path' nicht binden, da es null ist.

Dieser Teil ist das Problem:

write-zip -level 9 -append ($_.LastWriteTime).zip

Ich habe noch nie PowerShell verwendet, aber ich muss ein Skript bereitstellen. Ich kann keine C#-Lösung bereitstellen.

9voto

Enrico Campidoglio Punkte 51948

Das Problem ist, dass Get-ChildItem Instanzen der Klasse System.IO.FileInfo zurückgibt, die keine Eigenschaft mit dem Namen Path besitzt. Daher kann der Wert nicht automatisch auf den Path Parameter des Write-Zip cmdlet durch Pipe übertragen werden.

Sie müssen das ForEach-Object cmdlet verwenden, um die Dateien mithilfe der System.IO.FileInfo.FullName Eigenschaft zu zippen, die den vollständigen Pfad enthält:

Get-ChildItem -Path C:\Logs | Where-Object { $_.Extension -eq ".txt" } | ForEach-Object { Write-Zip -Path $_.FullName -OutputPath "$_.zip" }

Hier ist eine verkürzte Version des Befehls unter Verwendung von Aliases und Positionsparametern:

dir C:\Logs | where { $_.Extension -eq ".txt" } | foreach { Write-Zip $_.FullName "$_.zip" }

Zugehörige Ressourcen:

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X