Verarbeiten Sie Zip-Archive rekursiv, um Dateien zu extrahieren, während Sie ein bestimmtes Dateiformat verwerfen


0

UPDATE: Mir ist aufgefallen, dass viele Leute diesen Thread sehen, was mich glauben lässt, dass diese Situation doch nicht so selten ist. Wie auch immer, ich hatte so eine ähnliche / verwandten Fragen gestellt auf hier , was ziemlich anständig Lösungen zu hat , die das Problem in einer besseren Art und Weise lösen könnte.

Auf meinem Windows 7-Computer habe ich ein Verzeichnis mit heruntergeladenen Speicherauszügen in ZIP-Archiven. Jedes Archiv enthält wenige Textdateien, PDFs und selten XML-Dateien. Ich möchte den gesamten Inhalt jedes ZIP-Archivs in den entsprechenden Ordner extrahieren (muss während des Vorgangs erstellt werden), während das Extrahieren von PDFs verworfen bzw. ignoriert wird. Nach dem Extrahieren der erforderlichen Dateien aus einem Archiv darf die verarbeitete Zip-Datei nicht gelöscht werden (oder ich möchte wissen, wie ich sie in verschiedenen Situationen steuern kann).

Wenn dies hilfreich ist, liegt die Anzahl der Archive im Verzeichnis im Bereich von 60.000 bis 70.000. Außerdem benötige ich separate Ausgabeverzeichnisse, da Dateien in einem Archiv möglicherweise dieselben Namen haben wie Dateien in anderen.

Zum Beispiel,

  • Ich habe alle meine Archive wie one.zip, two.zip, .. in, sagen wir,D:\data
  • Ich erstelle einen neuen Ordner für verarbeitete Daten, sagen wir D:\extracted
  • Nun sollten die Daten von D:\data\one.zipzu gehen D:\extracted\one. Hier D:\extracted\onesollte automatisch angelegt werden.
  • Während dieses vollständigen Dekomprimierungsvorgangs sollten nicht alle gefundenen PDF-Dateien extrahiert (ignoriert) werden. Es hat keinen Sinn, zu extrahieren und dann zu löschen.
  • (Optional) Eine Protokolldatei sollte, sagen wir, aufrechterhalten werdenD:\extracted. Diese Datei soll verwendet werden, um die Verarbeitung an der Stelle fortzusetzen, an der sie im Fehlerfall belassen wurde.
  • (Optional) Mit dem Skript kann ich entscheiden, ob ich Quellarchive behalten oder nach der Verarbeitung löschen möchte.

Ich habe bereits nach einer Lösung gesucht, aber keine gefunden. Ich bin auf ein paar Fragen wie diese gestoßen

  1. Entpacken Sie rekursiv die Dateien, in denen sie sich befinden, und löschen Sie die Archive
  2. 7 Zip-Extrakt rekursiv
  3. Ist es möglich, Zip-Datei-Inhalte mit 7 Zip rekursiv aufzulisten, ohne sie zu extrahieren?

aber sie halfen nicht viel (ich bin übrigens kein Windows-Profi). Ich bin offen für die Installation von sicherer und werbefreier Software von Drittanbietern (Open Source) wie 7-zip.

BEARBEITEN: Gibt es ein Tool, mit dem ich das tun kann, was ich brauche ? Ich habe Multi Unpacker bereits ausprobiert . Es werden keine neuen Verzeichnisse erstellt und * .pdf-Dateien können nicht ignoriert werden. Es beginnt sogar langsam, ich denke, es liest zuerst alle Archive an der Quelle, bevor es mit der Verarbeitung beginnt.

Danke im Voraus!


Ohne ein Batch- oder Powershell-Skript sehe ich keinen Ausweg, soweit ich weiß, gibt es für so etwas keine sofort einsatzbereite Lösung.
private_meta

@private_meta danke für deine antwort. Ich hatte es bereits erraten, aber es ist gut, um sicher zu sein. Können Sie mir die richtige Richtung weisen, um eine PowerShell dafür zu schreiben? Ich verstehe auch, dass das Ignorieren von PDFs während des Extrahierens eine große Herausforderung darstellt. Daher bin ich bereit, das Skript alles extrahieren zu lassen und dann die PDFs zu löschen.
Fr0zenFyr

Antworten:


1

Wenn Sie die hier gefundene Antwort ändern , sollte dieses Teil des PowerShell-Skripts tun, was Sie wollen. Einfach als Datei mit der Endung ".ps1" speichern. Wenn Sie es aufrufen, rufen Sie es einfach als ./filename.ps1 auf und es extrahiert die Dateien in separate Ordner, löscht die ZIP-Dateien und entfernt alle Dateien mit der Erweiterung .pdf. Ich habe nicht getestet, ob es mit rekursiven Pfaden richtig funktioniert, aber es sollte, testen Sie es bitte.

Bearbeiten: Wenn Sie nicht möchten, dass Ihre ZIP-Dateien gelöscht werden, entfernen Sie die Zeile oder kommentieren Sie sie aus (#)rmdir -Path $_.FullName -Force

Anforderungen: PowerShell, 7-zip und Sie können den 7-zip-Pfad in der Datei festlegen.

param([string]$folderPath="D:\Blah\files")

Get-ChildItem $folderPath -recurse | %{ 

    if($_.Name -match "^*.`.zip$")
    {
        $parent="$(Split-Path $_.FullName -Parent)";    
        write-host "Extracting $($_.FullName) to $parent"

        $arguments=@("e", "`"$($_.FullName)`"", "-o`"$($parent)\$($_.BaseName)`"");
        $ex = start-process -FilePath "`"C:\Program Files\7-Zip\7z.exe`"" -ArgumentList $arguments -wait -PassThru;

        if( $ex.ExitCode -eq 0)
        {
            write-host "Extraction successful, deleting $($_.FullName)"
            rmdir -Path $_.FullName -Force
            $arguments1="$($parent)\$($_.BaseName)\*.pdf"
            rmdir -Recurse -Path $arguments1
        }
    }
}

Ich dachte daran, Sie zu bitten, mir zu helfen, den Code aus derselben Antwort heraus zu ändern. Sie sind ein Gedankenleser. Ich werde diesen Code ausprobieren und den Fortschritt hier melden. Ich bin wirklich froh, dass Sie sich die Zeit genommen haben, meine Frage sorgfältig zu lesen und fast jeden Aspekt davon abgedeckt haben.
Fr0zenFyr

Sie können es als Grundlage verwenden und nach Bedarf ändern. Der Teil, in dem es darum geht, PDF-Dateien erst gar nicht zu extrahieren, ist eine große Herausforderung. Ich denke nicht, dass er mit normalen Tools funktionieren würde.
private_meta

Wenn Sie mehr als einen "param" verwenden, müssen Sie diese wie folgt aufrufen: "./script.ps -folderPath path -delete" und so weiter.
Informationen zu

Danke, Kumpel, ich nehme dir meinen Hut ab. Dieses Skript hat fast alles erreicht, was ich wollte (außer der Logdatei-Sache). Da es keine bessere Antwort gibt, akzeptiere ich Ihre Antwort als Lösung. Übrigens, in der PowerShell meines Systems war es mir standardmäßig nicht möglich, das Skript auszuführen, das angibt, dass es deaktiviert ist. Ich hatte zwei Möglichkeiten, entweder das Skript zu signieren oder set-ExecutionPolicy Unrestrictedin PowerShell als Administrator auszuführen . Ich habe beide ausprobiert und sie haben funktioniert, obwohl die erste die bessere Wahl ist, aber aus dem Umfang dieses Kommentars heraus, um zu erklären, warum.
Fr0zenFyr

1
Wenn Sie ersetzen $arguments=@("e",mit $arguments=@("x", sollte Verzeichnisstruktur erhalten, testen Sie bitte , dass. Über das rekursive Extrahieren weiß ich nicht, ob es so richtig funktioniert, aber Sie können das Skript selbst mit einem neuen Verzeichnis aufrufen, in diesem Fall mit jedem Unterverzeichnis. Befindet sich eine Zip-Datei im Stammverzeichnis des Ordners, wird sie entpackt. Andernfalls wird es viel komplizierter. Ich bin allerdings nicht gut genug mit Powershell.
private_meta
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.