it-swarm.com.de

Wie kann ich eine Zeichenfolge in mehreren Dateien durchsuchen und die Namen der Dateien in Powershell zurückgeben?

Ich habe vor ein paar Tagen angefangen, Powershell zu lernen, und ich konnte auf Google nichts finden, was das tut, was ich brauche.

Ich wurde gebeten, einige Textzeichenfolgen in mehrere Dateien zu ersetzen. Ich kenne die Erweiterung der möglichen Zieldateien nicht unbedingt und kenne auch ihren Speicherort nicht. Bisher habe ich es geschafft, das Verzeichnis (get-ChildItem -recurse) rekursiv zu durchsuchen und den gesuchten String mit get-content und select-string zu finden:

Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy"

Das Problem ist, dass ich die Vorkommen des gesuchten Texts sehen kann, aber ich weiß nicht, wie ich PS anweisen soll, den Pfad und den Namen für alle übereinstimmenden Dateien ebenfalls zurückzugeben.

Wie kann ich den Namen und den Speicherort der Dateien ermitteln, die den gesuchten Ausdruck enthalten?

270
Bluz

Dies sollte den Speicherort der Dateien angeben, die Ihr Muster enthalten:

Get-ChildItem -recurse | Select-String -pattern "dummy" | group path | select name
418
jon Z

Hier gibt es eine Vielzahl genauer Antworten, aber hier ist der prägnanteste Code für verschiedene Variationen. In der oberen Zeile wird für jede Variation die vollständige Syntax und in der unteren Zeile die knappe Syntax angezeigt.

Punkt (2) ist eine präzisere Form der Antworten von Jon Z und manojlds, während Punkt (1) den Antworten von vikas368 und buygrush entspricht.

  1. Liste FileInfo Objekte für alle Dateien, die pattern enthalten:

    Get-ChildItem -Recursefilespec| Where-Object { Select-Stringpattern$_ -Quiet }ls -rfilespec| ? { slspattern$_ -q }
  2. Liste Dateinamen für alle Dateien mit Muster:

    Get-ChildItem -Recursefilespec| Select-Stringpattern| Select-Object -Unique Pathls -rfilespec| slspattern| select -u Path
  3. Liste FileInfo Objekte für alle Dateien nicht mit Muster:

    Get-ChildItem -Recursefilespec| Where-Object { !(Select-Stringpattern$_ -Quiet) }ls -rfilespec| ? { !(slspattern$_ -q) }
  4. Liste Dateinamen für alle Dateien nicht mit Muster:

    (Get-ChildItem -Recursefilespec| Where-Object { !(Select-Stringpattern$_ -Quiet) }).FullName(ls -rfilespec| ? { !(slspattern$_ -q) }).FullName
68
Michael Sorens

Leiten Sie den Inhalt Ihres

Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy"

zu fl *

Sie werden sehen, dass der Pfad bereits als Eigenschaft der Objekte zurückgegeben wird.

WENN Sie nur den Pfad möchten, verwenden Sie select path oder select -unique path, um Duplikate zu entfernen:

Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy" | select -unique path
14
manojlds

Dadurch werden der Pfad, der Dateiname und die gefundene Inhaltszeile angezeigt, die mit dem Muster übereinstimmen.

Get-ChildItem -Path d:\applications\*config -recurse |  Select-String -Pattern "dummy" 
13
user5000502
Get-ChildItem -r | ? {$_.psiscontainer -eq $false} | ? {gc $_.pspath |select-string -pattern "dummy"}

Dadurch erhalten Sie die vollständigen Details aller Dateien

9
vikas368

So würde ich es machen, du brauchst keine get-Inhalte:

ls -r | Select-String dummy | select line,path

oder

ls -r | Select-String dummy | fl *

Um zu sehen, was die verschiedenen Eigenschaften sind ...

9
js2010

Um die vollständigen Dateidetails im resultierenden Array beizubehalten, können Sie eine geringfügige Änderung der Antwort von vikas368 verwenden (die mit der automatischen Vervollständigung von ISE anscheinend nicht gut funktioniert hat):

Get-ChildItem -Recurse | Where-Object { $_ | Select-String -Pattern "dummy" }

oder kurz gesagt:

ls -r | ?{ $_ | Select-String -Pattern "dummy" }
5
buygrush

Wenn Sie in einem Verzeichnis suchen, können Sie dies tun:

select-string -Path "c:\temp\*.*" -Pattern "result"  -List | select Path
5
Esperento57

Daraufhin wird eine Liste mit dem vollständigen Pfad zu jeder Datei angezeigt, die die Suchzeichenfolge enthält:

foreach ($file in Get-ChildItem | Select-String -pattern "dummy" | Select-Object -Unique path) {$file.path}

Beachten Sie, dass keine Kopfzeile über den Ergebnissen und keine Textzeilen mit der Suchzeichenfolge angezeigt werden. Alles, was es Ihnen sagt, ist, wo Sie die Dateien finden können, die die Zeichenfolge enthalten.

3
Little Girl

Ich habe eine der obigen Antworten geändert, um ein bisschen mehr Informationen zu erhalten. Dies ersparte mir später eine zweite Abfrage. Es war ungefähr so:

Get-ChildItem `
        -Path "C:\data\path" -Filter "Example*.dat" -recurse | `
    Select-String -pattern "dummy" | `
    Select-Object -Property Path,LineNumber,Line | `
    Export-CSV "C:\ResultFile.csv"

Mit diesen Strukturen kann ich den Pfad und die Datei-Platzhalter angeben und den Dateinamen, die Zeilennummer und die relevante Zeile in einer Ausgabedatei speichern.

2
RenoGreg