jobo10437
Goto Top

PS Skript zum Suchen von beliebigen Worten in beliebigen Verzeichnisssen

Hallo in die Runde!

ich bin neu hier und kenne mich mit dem Erstellen von Skripten (.bat oder ps) nicht aus und wäre auf Unterstützung angewiesen.

Was soll passieren?

Ich habe in einem Hauptverzeichnis beliebig viele Unterverzeichnisse geschachtelt, auf deren unterster Ebene Dateien mit der Endung .txt liegen. Hierbei handelt es sich um die mit einer OCR-Software erstellten und abgelegten Inhalte.

Suche ich unter Win 10 im Explorer nach einem Begriff (z.B. Person, Ort), so bekomme ich das dort angezeigt.

Gewünscht ist aber, dass ich vom Stammverzeichnis (soll ausgewählt werden können) aus nach zwei oder mehr Begriffen suchen kann. Und zwar als AND bzw. OR.
Die Reihenfolge von Wort 1 und Wort 2 ist egal.
Das Ergebnis sollte idealer Weise in einer neuen Datei (Suchergebnis.txt) auf dem Desktop landen.

Ich will nicht verschweigen, dass es sich um zigtausend Dateien handelt.

Für jede Unterstützung wäre ich dankbar.
Es grüßt herzlich
Jobo

Content-ID: 621502

Url: https://administrator.de/contentid/621502

Ausgedruckt am: 24.11.2024 um 03:11 Uhr

erikro
erikro 12.11.2020 um 18:43:16 Uhr
Goto Top
Moin,

Zitat von @Jobo10437:
Ich will nicht verschweigen, dass es sich um zigtausend Dateien handelt.

wie lange darf das denn dauern? Powershell (und auch jede andere Skriptsprache) ist dafür eher zu langsam. AND und OR gehen auch in Windows Search, wenn denn die Dateien indiziert sind. Aber das scheint ja der Fall, wenn es mit einfachen Begriffen geht.
https://www.howtogeek.com/school/learning-windows-search/lesson4/

hth

Erik
chkdsk
chkdsk 13.11.2020 um 07:42:50 Uhr
Goto Top
Probiere es mal mit folgendem Skript. Am besten mal mit einem kleinen Ordner anfangen um zu schauen, wie lang es letztendlich braucht.
Function Get-Folder($initialDirectory)
{
    [System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms")|Out-Null  
    $Ordnername = New-Object System.Windows.Forms.FolderBrowserDialog
    $Ordnername.Description = "Ordner auswählen"  
    $Ordnername.rootfolder = "MyComputer"   
    if($Ordnername.ShowDialog() -eq "OK")  
    {
        $Ordner += $Ordnername.SelectedPath 
    }
    return $Ordner
}
$Path = Get-Folder 

$Text = read-host "Gebe den zu suchenden Text ein"   
$PathArray = @()

# This code snippet gets all the files in $Path 
Get-ChildItem $Path -recurse -Filter "*" |  
Where-Object { $_.Attributes -ne "Directory"} |  
ForEach-Object {
If (Get-Content $_.FullName | Select-String -Pattern $Text) {
$PathArray += $_.FullName
}
}
Write-Host "Contents of ArrayPath:"  
$PathArray | % {$_} | Out-File "C:\Users\Public\Desktop\Suchergebnis.txt"  
Jobo10437
Jobo10437 13.11.2020 um 09:43:54 Uhr
Goto Top
Guten Morgen chkdsk,

vielen Dank für die Hilfe.

Ich habe das Skript inzwischen zum Laufen bekommen (PS Rechte aktiviert und im Ausgabepfad meinen PC-Namen und Desktop angegeben).
Die Suche nach einem Begriff funktioniert.

Wie kann ich zwei oder mehr Begriffe eingeben als AND bzw. OR, z.B. a) Bonn und Berlin; b) Bonn oder Berlin.
Einzeln funktioniert es und liefert die gewünschte Ausgabe.
Die beiden Suchbegriffe müssen nicht direkt hinter einander stehen (mit Leerzeichen), sondern können beliebig im Text vorkommen (in der Regel ´je nur 1 mal). Auch kann die Reihenfolge anders sein als eingebeten --> Bonn Berlin ODER Berlin Bonn.

Gibt es dafür eine Lösung? Das wäre wirklich klasse.

Beste Grüße
Jobo
chkdsk
chkdsk 13.11.2020 um 09:53:31 Uhr
Goto Top
Du könntest noch eine zweite, dritte,... Eingabe einbauen (zw. Zeile 15&16) und diese dann in der Ausgabe (Zeile 22) ausgeben
TsukiSan
TsukiSan 13.11.2020 um 11:39:22 Uhr
Goto Top
Hallo Jobo10437,

Eventuell kannst du dir aus diesem Beitrag:
Powershell - Lösche Datei wenn String in Filename enthalten
etwas basteln.

Grüße

Tsuki
Jobo10437
Jobo10437 13.11.2020 um 15:09:38 Uhr
Goto Top
Dass ich daran scheitere, steht außer Frage. Ich bin newbi
Jobo
chkdsk
chkdsk 13.11.2020 um 15:34:16 Uhr
Goto Top
Function Get-Folder($initialDirectory)
{
    [System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms")|Out-Null  
    $Ordnername = New-Object System.Windows.Forms.FolderBrowserDialog
    $Ordnername.Description = "Ordner auswählen"  
    $Ordnername.rootfolder = "MyComputer"   
    if($Ordnername.ShowDialog() -eq "OK")  
    {
        $Ordner += $Ordnername.SelectedPath 
    }
    return $Ordner
}
$Path = Get-Folder 

$Text = read-host "Gebe den zu suchenden Text ein"   
$Text2 = read-host "Gebe den zu suchenden Text ein"   
$PathArray = @()

# This code snippet gets all the files in $Path 
Get-ChildItem $Path -recurse -Filter "*" |  
Where-Object { $_.Attributes -ne "Directory"} |  
ForEach-Object {
If (Get-Content $_.FullName | Select-String -Pattern $Text, Text2) {
$PathArray += $_.FullName
}
}
Write-Host "Contents of ArrayPath:"  
$PathArray | % {$_} | Out-File "C:\Users\Public\Desktop\Suchergebnis.txt"  
Jobo10437
Jobo10437 13.11.2020 um 18:36:01 Uhr
Goto Top
Ich bin begeistert!
Vielen Dank.

Es ergeben sich unterschiedliche Treffen, wenn ich z.B. eingeben:
Wort1: Berlin
Wort2: Hamburg
Treffer:
C:\test\M\Berlin.TXT
C:\test\M\Hamburg_Berlin.txt

Wort 1: Hamburg
Wort2: Berlin
Treffer:
C:\test\M\Bonn_Hamburg.txt
C:\test\M\Hamburg.txt
C:\test\M\Hamburg_Berlin.txt
C:\test\M\Hamburg_Bonn.txt

Es fehlt immer das Ergebnis, wenn nur der 2. Begriff gefunden wird

Anmerkung:
Ich habe in der jeweiligen Textdatei nur die Stadt/Städte eingegeben, die sich im Titel genannt sind. So konnte ich das Ergebnis schneller analysieren.

Vielleicht gibt es auch hier noch eine Lösung.
Beste Grüße
Jobo