ZIP-Archive nach Dateien durchsuchen und Pfade ausgeben
Hallo,
im Windows Explorer ist es möglich nach Dateien in ZIP-Archiven zu suchen (vorausgesetzt die Option zum Suchen in Archiven ist unter den Einstellungen im Explorer gesetzt).
Gibt es eine Möglichkeit die Pfade der gefunden ZIP-Archiven z. B. in eine TXT-Datei auszugeben?
Wenn Windows nach Inhalte in Archiven suchen kann, muss doch logischerweise eine Variante geben, wie das Ergebnis ausgegeben werden kann.
Mit 7-Zip habe ich ebenso probiert (7z.exe l -r "%Path%" "SearchFile"), jedoch ist die Ausgabe sehr umfangreich und mir ist es nicht gelungen nur die Pfade der betroffenen ZIP-Archiven zu extrahieren.
Welche Möglichkeiten via Batch kennt ihr?
evinben
im Windows Explorer ist es möglich nach Dateien in ZIP-Archiven zu suchen (vorausgesetzt die Option zum Suchen in Archiven ist unter den Einstellungen im Explorer gesetzt).
Gibt es eine Möglichkeit die Pfade der gefunden ZIP-Archiven z. B. in eine TXT-Datei auszugeben?
Wenn Windows nach Inhalte in Archiven suchen kann, muss doch logischerweise eine Variante geben, wie das Ergebnis ausgegeben werden kann.
Mit 7-Zip habe ich ebenso probiert (7z.exe l -r "%Path%" "SearchFile"), jedoch ist die Ausgabe sehr umfangreich und mir ist es nicht gelungen nur die Pfade der betroffenen ZIP-Archiven zu extrahieren.
Welche Möglichkeiten via Batch kennt ihr?
evinben
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 333171
Url: https://administrator.de/contentid/333171
Ausgedruckt am: 24.11.2024 um 13:11 Uhr
36 Kommentare
Neuester Kommentar
Servus @evinben,
ich würd's zwar z.B. mit einem Tool wie Treesize oder diversen anderen Suchtools machen, aber wenns programmatisch sein soll, hier z.B. als schnelles Powershell-Skript:
welches man dann so nutzt um einen Ordner mit seinen Unterordnern zu durchsuchen (Suchbegriff mit Wildcards):
Es gibt auch noch mehr Methoden wie z.B. über das Shell.Application COM-Object. Wenn du willst mach ich dir dazu auch noch ein Beispiel.
Grüße Uwe
-edit-
Hier alternativ noch das PS Skript mit dem Shell.Application-Object (Aufruf wie oben):
Und wenn du willst packst du das ganze als Einzeiler in eine Batch
Welche du dann so aufrufst:
Also such dir was passendes raus
ich würd's zwar z.B. mit einem Tool wie Treesize oder diversen anderen Suchtools machen, aber wenns programmatisch sein soll, hier z.B. als schnelles Powershell-Skript:
param(
[parameter(mandatory=$true)][ValidateScript({Test-Path $_})][string]$searchfolder,
[parameter(mandatory=$true)][ValidateNotNullOrEmpty()][string]$searchstring
)
# Assemblies laden (benötigt mindestens Powershell 3.0)
if ($PSVersionTable.PSVersion.Major -lt 3){write-host "ERROR: Minimum Powershell Version 3.0 is required!" -F Yellow; return}
Add-Type -AssemblyName System.IO.Compression
Add-Type -AssemblyName System.IO.Compression.Filesystem
gci $searchfolder -Filter *.zip -Recurse -Force -ErrorAction SilentlyContinue | ?{([System.IO.Compression.ZipFile]::OpenRead($_.Fullname).Entries | ?{$_.FullName -like $searchstring})} | select -Expand Fullname
powershell -F "C:\Pfad\script.ps1" "C:\Ordner" "*suchbegriff*"
Grüße Uwe
-edit-
Hier alternativ noch das PS Skript mit dem Shell.Application-Object (Aufruf wie oben):
param(
[parameter(mandatory=$true)][ValidateScript({Test-Path $_})][string]$searchfolder,
[parameter(mandatory=$true)][ValidateNotNullOrEmpty()][string]$searchstring
)
$shell = New-Object -Com Shell.Application
$list = {param($f) $f.Items() | ?{$_.IsFolder} | %{. $list $_.GetFolder};$f.Items() | ?{!$_.IsFolder -and $_.Name -like $searchstring}}
gci $searchfolder -Filter *.zip -Recurse -Force -ErrorAction SilentlyContinue | ?{(. $list $shell.NameSpace($_.Fullname))} | select -Expand Fullname
@echo off
powershell -NoProfile -ExecutionPolicy Bypass -Command "$shell = New-Object -Com Shell.Application; $list = {param($f) $f.Items() | ?{$_.IsFolder} | %%{. $list $_.GetFolder};$f.Items() | ?{!$_.IsFolder -and $_.Name -like '%~2'}};gci '%~1' -Filter *.zip -Recurse -ErrorAction SilentlyContinue | ?{(. $list $shell.NameSpace($_.Fullname))} | select -Expand Fullname"
script.cmd "C.\Ordner" "*suchbegriff*"
Also such dir was passendes raus
Doch das gibt die Pfade der Zips im Beispiel oben nur auf der Konsole aus, kannst du ja ganz einfach in eine Datei umleiten, entweder mit Redirection in der Batch oder mit set-content im PS-Code!
Könnte die Ausgabe leicht innerhalb der Batch empfangen werden ohne dass du jetzt gleich den ganzen Code ändern muss?
Klar wie immer. Die Ausgabe einfach mit >"Datei.txt" hinter dem Befehl umleiten.script.cmd "C.\Ordner" "*suchbegriff*" >"Datei.txt"
Zitat von @evinben:
ach, lustig. Ich schrieb es, weil die Festplatte zwar durch Zugrissversuch aufgeweckt wurde (als ob sie durchgesucht wäre)
?ach, lustig. Ich schrieb es, weil die Festplatte zwar durch Zugrissversuch aufgeweckt wurde (als ob sie durchgesucht wäre)
aber in der CMD nichts zu sehen war und daher schaute ich mich nach eventuelle Ausgabedatei um.
Beim zweiten Aufruf ist mir bewusst geworden, dass das angegebene Verzeichnis gar nicht erstmals durchgesucht wird.
Irgendwas bleibt da noch anzupassen.
Nein, geht einwandfrei (hier getestet!)Beim zweiten Aufruf ist mir bewusst geworden, dass das angegebene Verzeichnis gar nicht erstmals durchgesucht wird.
Irgendwas bleibt da noch anzupassen.
Klar wie immer. die Ausgabe einfach mit >"Datei.txt" umleiten.
Aktuell rufe ich die Datei direkt (nicht via script.cmd "C.\Ordner" "*suchbegriff*")und ich meinte in meiner Frage die Zeilen als Argument oder als echo für die Weiterverarbeitung innerhalb der einen Batch empfangen. Aber dies ist sind Kleinigkeiten, da über eine externe Datei die Ausgabe einzuholen es ebenso völlig OK ist.
Da baust du einfach eine For-Schleife um das Konstrukt
Also nochmal für dich ohne externen Aufruf:
Geht hier einwandfrei.
@echo off
set "suchordner=C:\Ordner"
set "suchbegriff=*test*"
for /f "delims=" %%a in ('powershell -NoProfile -ExecutionPolicy Bypass -Command "$shell = New-Object -Com Shell.Application; gci '%suchordner%' -Filter *.zip -Recurse -Force -ErrorAction SilentlyContinue | ?{($shell.NameSpace($_.Fullname).Items() | ?{$_.Name -like '%suchbegriff%'})} | select -Expand Fullname"') do (
echo %%a
)
Moin Leuts,
Kann ich ebenso bestätigen. Fehler wird also bei dir liegen.
Welches OS?
Gruß p.
Kann ich ebenso bestätigen. Fehler wird also bei dir liegen.
hm ... was könnt es denn sein
- Fehlende Zugriffsrechte mit dem Account der das Skript aufruft, wenn du ein ganzes Laufwerk durchsuchst!
- Falscher Suchbegriff
- Powershell Executionpolicy nicht freigeschaltet.
- Zu tiefe Ordnerverschachtelung > 260 Zeichen
- inkompatible ZIP-Files
Welches OS?
Gruß p.
Zitat von @evinben:
Fehlende Zugriffsrechte
Als Admin habe ich davor ebenso versucht. Im Prozess Explorer wird mir aber angezeigt, PowerShell stets ausgelastet ist (ca. 50% CPU) - also da tut sich was, aber das Laufwerk wird nur aufgeweckt und nichts mehr.
Ein ganzes Laufwerk zu durchsuchen kann dauern, je nachdem wie viele ZIP-Files es gibt.Fehlende Zugriffsrechte
Als Admin habe ich davor ebenso versucht. Im Prozess Explorer wird mir aber angezeigt, PowerShell stets ausgelastet ist (ca. 50% CPU) - also da tut sich was, aber das Laufwerk wird nur aufgeweckt und nichts mehr.
Mach es doch erst mal in einem Testordner .
das Laufwerk wird nur aufgeweckt
? Häh lass es erst mal an min jung Zu tiefe Ordnerverschachtelung
tja, das liegt aber nicht an mir - es geht um die Windows Sicherung, da wird ordentlich verschachtelt.
.NET kann aber nicht mehr wie 260 da steigt es aus und überspringt die Ordner. Entferne mal das -ErrorAction SilentlyContinue dann siehst du eventuelle Fehler.
Zitat von @evinben:
Zu tiefe Ordnerverschachtelung
tja, das liegt aber nicht an mir - es geht um die Windows Sicherung, da wird ordentlich verschachtelt.
Da klingelts bei mir, die Dateien die du suchst liegen innerhalb des ZIPs in Unterordnern richtig? Dann kann das Batch-Skript oben sie nicht finden weil es nur auf der ersten Ebene in diesen gesucht hat.Zu tiefe Ordnerverschachtelung
tja, das liegt aber nicht an mir - es geht um die Windows Sicherung, da wird ordentlich verschachtelt.
Hiermit durchsucht es auch Unterordner in den ZIPs:
@echo off
set "suchordner=C:\Ordner"
set "suchbegriff=*.pst"
for /f "delims=" %%a in ('powershell -NoProfile -ExecutionPolicy Bypass -Command "$shell = New-Object -Com Shell.Application; $list = {param($f) $f.Items() | ?{$_.IsFolder} | %%{. $list $_.GetFolder};$f.Items() | ?{!$_.IsFolder -and $_.Name -like '%suchbegriff%'}};gci '%suchordner%' -Filter *.zip -Recurse -ErrorAction SilentlyContinue | ?{(. $list $shell.NameSpace($_.Fullname))} | select -Expand Fullname"') do (
echo %%a
)
Skript ganz oben wurde darauf hin auch aktualisiert
So, wünsche euch noch ein sonniges Wochenende!
Grüße Uwe
Da das Shell.Application Objekt keine Methode zum rekursiven Listen von Dateien innerhalb der Zips bereitstellt muss diese Methode es manuell machen.
Schneller ist das erst genannte Powershell-Skript im ersten Beitrag oben, erfordert jedoch das min. PS 3.0 auf dem Rechner installiert ist, lässt sich aber auch zu einem Einzeiler für die Batch zusammenstampfen wenn man das wollte.
Das das PS Skript nicht die Performance hat wie nativer C Code den Windows nutzt sollte klar sein .
Und Windows selber nutzt zusätzlich die Indizierung zur Beschleunigung!
Aufhüschen kann man das natürlich immer noch mit paralleler Verarbeitung. Gibt viele Wege nach Rom.
Ausgaben komplizierter Art lassen sich aber auch problemlos via Regex Parsen wenn du das willst, das wäre auch kein Problem.
Schneller ist das erst genannte Powershell-Skript im ersten Beitrag oben, erfordert jedoch das min. PS 3.0 auf dem Rechner installiert ist, lässt sich aber auch zu einem Einzeiler für die Batch zusammenstampfen wenn man das wollte.
Das das PS Skript nicht die Performance hat wie nativer C Code den Windows nutzt sollte klar sein .
Und Windows selber nutzt zusätzlich die Indizierung zur Beschleunigung!
Aufhüschen kann man das natürlich immer noch mit paralleler Verarbeitung. Gibt viele Wege nach Rom.
Ausgaben komplizierter Art lassen sich aber auch problemlos via Regex Parsen wenn du das willst, das wäre auch kein Problem.
Dann machst du den Aufruf falsch, es müssen zwei Parameter sein.
Sie dürfen 'nicht' zusammen durch Anführungszeichen umrahmt sein. Folge dem Aufruf oben damit klappt das Einwandfrei!
Das Skript prüft den ersten auf Existenz im Dateisystem.
Auch das Skript habe ich natürlich vor dem Posten überprüft!
Du bist heut aber ein echt schwerer Fall, Mensch Meier .
Wenn dich Powershell interessiert dann beschäftige dich damit erst mal eindringlich, einen Kursus kann ich dir hier nicht geben, Sorry.
Sie dürfen 'nicht' zusammen durch Anführungszeichen umrahmt sein. Folge dem Aufruf oben damit klappt das Einwandfrei!
Das Skript prüft den ersten auf Existenz im Dateisystem.
Auch das Skript habe ich natürlich vor dem Posten überprüft!
Du bist heut aber ein echt schwerer Fall, Mensch Meier .
Wenn dich Powershell interessiert dann beschäftige dich damit erst mal eindringlich, einen Kursus kann ich dir hier nicht geben, Sorry.
Siehst du ja gerade am eigenen Leib
Code dafür s. oben.
Code dafür s. oben.
Das zweite Skript (ohne Namespace-Object) ist mit 8 Min. ebenso fast genauso lahm, wie das 3. Skript (der Einzeiler in Batch).
Ist ja kein Wunder denn das ist das selbe nur nicht für den Einbau in die Batch angepasst
Das ist ein Super-Skript, ein Ansatz den ich gesucht habe
Ich bin auf der Suche nach folgendem:
Mehrere Zip-Dateien sind in einem Verzeichnis, die Zip-Dateien enthalten Unterorder und in diesen dann die Dateien.
Ich möchte die Zips nach bestimmten Suchbegriffen durchforsten und dann bei einem Fund das entsprechende Verzeichnis komplett nach Ziel X entpacken. Das entpackte Verzeichnis soll so heissen wie die zip Datei ...
Ist vielleicht noch ein bisschen Holz, aber ich muss mich wohl dringend mal mit Powershell auseinandersetzen
Ich bin auf der Suche nach folgendem:
Mehrere Zip-Dateien sind in einem Verzeichnis, die Zip-Dateien enthalten Unterorder und in diesen dann die Dateien.
Ich möchte die Zips nach bestimmten Suchbegriffen durchforsten und dann bei einem Fund das entsprechende Verzeichnis komplett nach Ziel X entpacken. Das entpackte Verzeichnis soll so heissen wie die zip Datei ...
Ist vielleicht noch ein bisschen Holz, aber ich muss mich wohl dringend mal mit Powershell auseinandersetzen