none
Dateien nach Suchwörtern durchsuchen RRS feed

  • Frage

  • Hallo,

    habe ein Powershell Script, was folgende Funktionen bieten soll

    - Suche nach bestimmten Dateien, die entsprechende Wörter enthalten

    - Exportiere es in eine CSV

    Problem

    - Wie bekomme ich heraus welche Suchwörter in diesem Dokument gefunden wurden?

    Ergebnis sollte wie folgt aussehen

    Datei + Gefundene Suchwörter in dieser Datei

    Beispiel:

    Datei 1     Passwort, User

    Datei 2     User

    Datei 3    Passwort, User, PWD

    Hier mein Script:

    $fileName = "C:\Test\FileContent_" + (Get-Date -Format yyyy-MM-dd-HH-mm ) + ".csv"
    #$myDrive = "c:/Test"
    gci $myDrive -recurse -include *.vbs, *.xml, *.txt, *.cfg, *.ini, *.pwd, *.bat, *.cmd | Select-String  -pattern  "PWD", "USER", "USR", -AllMatches | select name | Export-Csv $fileName -NoType -force

    Kann mir hier jemand weiterhelfen? ich verzweifle. Mit der Funktion "select name, match", bekomme ich nicht mein gewünschtes Ergebnis.

    Hier bekomme ich nur den Dateipfad und den Namen aber nicht welche Wörter in der Datei gefunden wurden

    Gruß


    Mamonga



    • Bearbeitet Mamonga86 Mittwoch, 14. August 2013 15:20
    • Bearbeitet Denniver ReiningMVP, Moderator Montag, 19. August 2013 17:45 Titel geändert. Dies ist das Powershell Forum, kein Prefix notwendig.
    Mittwoch, 14. August 2013 15:17

Antworten

  • so ist es im Prinzip, allerdings mit dem Nachteil, dass er dann pro Treffer in der Datei eine Zeile ausgibt, entahelt die Datei also 5x das Wort User und 1x PWD macht dies 6 Zeilen.

    Auf die schnelle haette ich die Loesung

    Get-ChildItem -recurse -include *.ps1, *.txt | ForEach-Object {
        $FN = $_.FullName
        $Treffer = @()
        $_ | Select-String  -pattern "Write", "Get" -AllMatches | ForEach-Object {
            $Treffer += $_.matches | Select-Object -ExpandProperty value
        }
        $Treffer = $Treffer |Sort-Object -Unique
        $TrefferLine = $Treffer -join ", "
        if ($Treffer.Count -gt 0) {
            "$FN $TrefferLine"
        }
    }

    Mittwoch, 14. August 2013 20:15
  • Das hatte ich bereits gepostet. Hier nochmal:

    $fileName = "d:\tmp\FileContent_" + (Get-Date -Format yyyy-MM-dd-HH-mm ) + ".csv"
    $myDrive = "d:\tmp"
    gci $myDrive -recurse -include *.vbs, *.xml, *.txt, *.cfg, *.ini, *.pwd, *.bat, *.cmd | Select-String  -pattern  "PWD", "USER", "USR"-AllMatches  | select  PATH , Matches | `
    group Path  | % {  add-content $fileName -Value "$($_.Name) ,$($_.Group | select -ExpandProperty Matches | select -ExpandProperty Value)"  } 

    Eine CSV ist nichts anderes als eine Textdatei, die Zeilen mit von einem Trennnzeichen getrennten Werten enthält. Kann mal also auch mit add-content erstellen. Meine Lösung hat zwei Spalten: Datei und Suchwörter. Falls du noch eine Headerzeile für die CSV haben möchtest füge vor der Zeile mit  "gci $mydrive..."  folgende neue Zeile ein:


    set-content  $fileName -Value "Dateipfad,Suchwörter"

     

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com
    Powershell Codesnippet Manager: Link

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.

    Mittwoch, 14. August 2013 21:47
    Moderator
  • Hallo,

    vielen Dank an Denniver Reining und Brima. Ohne euch hätte ich das nie hinbekommen:

    Habe noch zusätzliche Foreach Schleifen eingefügt, damit jede Datei von vorne gesucht wird. Zusätzlich habe ich noch eine Webconfig erstellt um hier eine Schleife zu erzeugen:

    Write-Host 'Suche nach Dateien mit Dateinamen'
    set-content  $fileName -Value "Dateipfad,Suchwörter"
    gci $myDrive -recurse -include *.vbs, *.xml, *.txt, *.cfg, *.ini, *.pwd, *.bat, *.cmd | ForEach-Object { 
        $FN = $_.FullName + ", "
        $Treffer = @()
        foreach ( $word in $config.configuration.words.word){
                $_ |  Select-String  -pattern  $Word  | ForEach-Object {
                $Treffer += $_.matches | Select-Object -ExpandProperty value
            }
        } 
        $Treffer = $Treffer |Sort-Object -Unique 
        $TrefferLine = $Treffer -join " "
        if ($Treffer.Count -gt 0) {
            "$FN $TrefferLine"
        }
    } | add-content $fileName
     }

    • Als Antwort markiert Mamonga86 Donnerstag, 15. August 2013 11:47
    Donnerstag, 15. August 2013 11:46

Alle Antworten

  • Bin schon ein Schritt weiter. Leider bekomme ich damit nur den Value raus:

    Weiß einer wie ich das entsprechend formatieren kann, dass die Suchwörter in einer Zeile sind und daneben der Dateipfad?

    Aktuell stehen die untereinander und ich möchte die Datei nur einmal aufgeführt haben

    $fileName = "C:\Test\FileContent_" + (Get-Date -Format yyyy-MM-dd-HH-mm ) + ".txt"
    $myDrive = "c:/Test"
    gci $myDrive -recurse -include *.vbs, *.xml, *.txt, *.cfg, *.ini, *.pwd, *.bat, *.cmd | Select-String  -pattern "PWD", "User", -AllMatches | foreach-object {$_.matches} | select-object value | Export-Csv $fileName -NoType -force

    Mittwoch, 14. August 2013 18:01
  • Du must eigentlich nur die richtigen Properties selektieren :)

    Probiers mal so:

    gci $myDrive -recurse -include *.vbs, *.xml, *.txt, *.cfg, *.ini, *.pwd, *.bat, *.cmd | Select-String  -pattern  "PWD", "USER", "USR"-AllMatches  | select PATH , Matches | out-host  # |  Export-Csv $fileName -NoType -force
    
     
     Grüße, Denniver

    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere gute Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibt die Antwort.


    Mittwoch, 14. August 2013 19:47
    Moderator
  • so ist es im Prinzip, allerdings mit dem Nachteil, dass er dann pro Treffer in der Datei eine Zeile ausgibt, entahelt die Datei also 5x das Wort User und 1x PWD macht dies 6 Zeilen.

    Auf die schnelle haette ich die Loesung

    Get-ChildItem -recurse -include *.ps1, *.txt | ForEach-Object {
        $FN = $_.FullName
        $Treffer = @()
        $_ | Select-String  -pattern "Write", "Get" -AllMatches | ForEach-Object {
            $Treffer += $_.matches | Select-Object -ExpandProperty value
        }
        $Treffer = $Treffer |Sort-Object -Unique
        $TrefferLine = $Treffer -join ", "
        if ($Treffer.Count -gt 0) {
            "$FN $TrefferLine"
        }
    }

    Mittwoch, 14. August 2013 20:15
  • Zusammengefasst ( Ausgabe jeder Datei einmal mit allen gefundenen Suchwörtern):

     

    gci $myDrive -recurse -include *.vbs, *.xml, *.txt, *.cfg, *.ini, *.pwd, *.bat, *.cmd | Select-String  -pattern  "PWD", "USER", "USR"-AllMatches  | select  PATH , Matches | `
    group Path  | % { $_.Name , $($_.Group | select -ExpandProperty Matches | select -ExpandProperty Value)  } 

    Grüße, Denniver

     


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere gute Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibt die Antwort.

    Mittwoch, 14. August 2013 20:23
    Moderator
  • Wenn ich es so mache bekomme ich kein CSV Import hin.

    Deswegen auch bei mir im Skript "Foreach-Objekt" um aus dem Wert den Value zu bekommen. Wenn das von dir versuche  ich das versuche mit Export CSV bekomme ich nicht das gewünschte Ergebnis. Sieht nur gut aus über "out-host"

    Mittwoch, 14. August 2013 20:38
  • Ich hatte mich an dein Beispiel von oben gehalten. Du hast leider immer noch nicht erwähnt wie die CSV denn aussehen soll. So ginge es nach dem Schema "Dateiname,Suchwort1 Suchwort 2 etc.":

     

    $fileName = "d:\tmp\FileContent_" + (Get-Date -Format yyyy-MM-dd-HH-mm ) + ".csv"
    $myDrive = "d:\tmp"
    gci $myDrive -recurse -include *.vbs, *.xml, *.txt, *.cfg, *.ini, *.pwd, *.bat, *.cmd | Select-String  -pattern  "PWD", "USER", "USR"-AllMatches  | select  PATH , Matches | `
    group Path  | % {  add-content $fileName -Value "$($_.Name) ,$($_.Group | select -ExpandProperty Matches | select -ExpandProperty Value)"  } 
     

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com
    Powershell Codesnippet Manager: Link

    Hilf mit und markiere gute Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibt die Antwort.

    Mittwoch, 14. August 2013 21:09
    Moderator
  • Hallo brima,

    vielen dank für die Hilfe. Sieht auch per "out-Host" gut aus. Zwei Punkte hätte ich noch:

    1. Wie bekomme ich das in eine CSV exportiert? Leider bekomme ich ich Parameter irgendwie nicht übergeben.

    2. Alle Suchwörter werden nur gefunden, wenn diese sich nicht in einer Zeile befinden:

    Beispiel 1 (Inhalt der Datei in einer Linie)

    Datei1 = USR Password  User

    Ergebnis = User

    Beispiel 2 (Inhalt der Datei untereinander)

    Datei 2 = User

    Password

    User

    Ergebnis = User, Password, User

    Habe das mal in meinen Code integriert: 

    $fileName = "C:\Test\FileContent_" + (Get-Date -Format yyyy-MM-dd-HH-mm ) + ".txt"
    $myDrive = "c:/Test"
    gci $myDrive -recurse -include *.vbs, *.xml, *.txt, *.cfg, *.ini, *.pwd, *.bat, *.cmd | ForEach-Object { 
        $FN = $_.FullName
        $Treffer = @()
        $_ | Select-String  -pattern "PWD", "User", "USR" -AllMatches | ForEach-Object {
            $Treffer += $_.matches | Select-Object -ExpandProperty value
        }
        $Treffer = $Treffer |Sort-Object -Unique
        $TrefferLine = $Treffer -join ", "
        if ($Treffer.Count -gt 0) {
            "$FN $TrefferLine"
        }
    } | out-host |   Export-Csv $fileName -NoType -force

    Vielen Dank schon mal :-)


    • Bearbeitet Mamonga86 Mittwoch, 14. August 2013 21:22 Ergänzung Text
    Mittwoch, 14. August 2013 21:21
  • Hallo,

    da viele nach dem aussehen meiner CSV fragen. sie sollte wie folgt aussehen:

    Spalte 1 = Dateipfad

    Spalte 2 = Suchwörter

    Beispiel

    Datei 1     Passwort, User

    ------------------------------

    Datei 2     User

    -------------------------------

    Datei 3    Passwort, User, PWD

    --------------------------------





    • Bearbeitet Mamonga86 Mittwoch, 14. August 2013 21:37
    Mittwoch, 14. August 2013 21:32
  • Schön. :) Und was genau gefällt dir an der von mir zuletzt vorgeschlagenen Lösung nicht?

    Blog: http://bytecookie.wordpress.com
    Powershell Codesnippet Manager: Link

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.

    Mittwoch, 14. August 2013 21:41
    Moderator
  • Danken Denniver Reining für die Hilfe,

    Hier wird leider jedes gefundene Suchwort ausgegeben und jedes davon auch in eine neue Zeile. Wie wäre denn da der CSV Export?

     Ich benötige nur einmal die Ausgabe und das nebeneinander und nicht in einer neuen Zeile :-)

    Mittwoch, 14. August 2013 21:42
  • Das hatte ich bereits gepostet. Hier nochmal:

    $fileName = "d:\tmp\FileContent_" + (Get-Date -Format yyyy-MM-dd-HH-mm ) + ".csv"
    $myDrive = "d:\tmp"
    gci $myDrive -recurse -include *.vbs, *.xml, *.txt, *.cfg, *.ini, *.pwd, *.bat, *.cmd | Select-String  -pattern  "PWD", "USER", "USR"-AllMatches  | select  PATH , Matches | `
    group Path  | % {  add-content $fileName -Value "$($_.Name) ,$($_.Group | select -ExpandProperty Matches | select -ExpandProperty Value)"  } 

    Eine CSV ist nichts anderes als eine Textdatei, die Zeilen mit von einem Trennnzeichen getrennten Werten enthält. Kann mal also auch mit add-content erstellen. Meine Lösung hat zwei Spalten: Datei und Suchwörter. Falls du noch eine Headerzeile für die CSV haben möchtest füge vor der Zeile mit  "gci $mydrive..."  folgende neue Zeile ein:


    set-content  $fileName -Value "Dateipfad,Suchwörter"

     

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com
    Powershell Codesnippet Manager: Link

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.

    Mittwoch, 14. August 2013 21:47
    Moderator
  • Hallo Denniver,

    vielen vielen vielen Dank. Das hat auf einmal funktioniert. Gestern bekam ich keine Werte in meine CSV.

    Mein Problem ist folgendes, dass wenn ein Suchwort gefunden wurde, muss das Dokument erneut durchsucht werden und nicht ab den Punkt wo er das eine Suchwort gefunden hat.

    Ziel

    Dokument durchsuchen nach Suchwort. Wenn gefunden, dann neues Suchwort nehmen und erneut durchsuchen.

    Aktuell springt es dann in die nächste Zeile und sucht von dort aus mit dem neuen Suchwort.

    Wie kann ich das ändern?

    Kleine Ergänzung:

    In deinem Skript bekomme ich jedesmal das gefundene Suchwort. In der Version von Brima nur einmal.

    Habe es um den Parameter ergänzt aber ebkomm dann immer nur ein Wert. Hast du dafür ne Lösung?

    Sort-Object -Uniqu



    • Bearbeitet Mamonga86 Donnerstag, 15. August 2013 07:52
    Donnerstag, 15. August 2013 07:29
  • Hallo,

    um es erklärender zu gestalten. Wenn ein Wort gefunden wurde, sollte die Datei von beginn an erneut  mit dem zweiten Suchwort dursucht werden und nicht von dem Punkt aus, wo das letzte Suchwort gefunden wurde.


    • Bearbeitet Mamonga86 Donnerstag, 15. August 2013 09:55
    Donnerstag, 15. August 2013 09:55
  • Hallo,

    vielen Dank an Denniver Reining und Brima. Ohne euch hätte ich das nie hinbekommen:

    Habe noch zusätzliche Foreach Schleifen eingefügt, damit jede Datei von vorne gesucht wird. Zusätzlich habe ich noch eine Webconfig erstellt um hier eine Schleife zu erzeugen:

    Write-Host 'Suche nach Dateien mit Dateinamen'
    set-content  $fileName -Value "Dateipfad,Suchwörter"
    gci $myDrive -recurse -include *.vbs, *.xml, *.txt, *.cfg, *.ini, *.pwd, *.bat, *.cmd | ForEach-Object { 
        $FN = $_.FullName + ", "
        $Treffer = @()
        foreach ( $word in $config.configuration.words.word){
                $_ |  Select-String  -pattern  $Word  | ForEach-Object {
                $Treffer += $_.matches | Select-Object -ExpandProperty value
            }
        } 
        $Treffer = $Treffer |Sort-Object -Unique 
        $TrefferLine = $Treffer -join " "
        if ($Treffer.Count -gt 0) {
            "$FN $TrefferLine"
        }
    } | add-content $fileName
     }

    • Als Antwort markiert Mamonga86 Donnerstag, 15. August 2013 11:47
    Donnerstag, 15. August 2013 11:46