468 Stimmen

Wie wird eine Zeichenfolge in mehreren Dateien gesucht und die Namen der Dateien in Powershell zurückgegeben?

Ich habe vor ein paar Tagen angefangen, Powershell zu lernen, und ich konnte bei Google nichts finden, was das tut, was ich brauche, also bitte ich um Verständnis für meine Frage.

Ich bin gebeten worden, einige Textzeichenfolgen in mehreren Dateien zu ersetzen. Ich kenne nicht unbedingt die Erweiterung der möglichen Zieldateien und weiß auch nicht, wo sie sich befinden. Bislang ist es mir gelungen, rekursiv in das Verzeichnis ( get-ChildItem -recurse ) und finde die gesuchte Zeichenkette mit get-content und select-string:

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

Das Problem ist, dass ich die Vorkommen des gesuchten Textes sehen kann, aber ich weiß nicht, wie ich PS anweisen kann, auch den Pfad und den Namen für jede passende Datei zurückzugeben.

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

741voto

jon Z Punkte 14850

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

Get-ChildItem -Recurse | Select-String "dummy" -List | Select Path

108voto

Michael Sorens Punkte 33793

Hier gibt es eine Vielzahl von genauen Antworten, aber hier ist der prägnanteste Code für mehrere verschiedene Varianten. Für jede Variante zeigt die obere Zeile die vollständige Syntax und die untere die knappe Syntax.

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

  1. Liste DateiInfo Objekte für alle Dateien, die das Muster enthalten:

    Get-ChildItem -Recurse filespec | Where-Object { Select-String pattern $_ -Quiet }
    ls -r filespec | ? { sls pattern $_ -q }
  2. Liste Dateinamen für alle Dateien, die das Muster enthalten:

    Get-ChildItem -Recurse filespec | Select-String pattern | Select-Object -Unique Path
    ls -r filespec | sls pattern | select -u Path
  3. Liste DateiInfo Objekte für alle Dateien pas Muster enthalten:

    Get-ChildItem -Recurse filespec | Where-Object { !(Select-String pattern $_ -Quiet) }
    ls -r filespec | ? { !(sls pattern $_ -q) }
  4. Liste Dateinamen für alle Dateien pas Muster enthalten:

    (Get-ChildItem -Recurse filespec | Where-Object { !(Select-String pattern $_ -Quiet) }).FullName
    (ls -r filespec | ? { !(sls pattern $_ -q) }).FullName

43voto

js2010 Punkte 17269

So würde ich es machen, Sie brauchen get-content nicht:

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

o

ls -r | Select-String dummy | fl *

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

Dies ist schneller . Das zweite Argument ist -filter:

ls -r . *.bat | select-string netsh

ls -r -path . -filter *.bat | select-string netsh

27voto

user5000502 Punkte 221

Dadurch werden der Pfad, der Dateiname und die gefundene Inhaltszeile, die dem Muster entspricht, angezeigt.

Get-ChildItem -Path d:\applications\*config -recurse |  Select-String -Pattern "dummy"

19voto

manojlds Punkte 273771

Übertragen Sie den Inhalt Ihrer

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

zu fl *

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

WENN Sie nur den Pfad wollen, verwenden Sie select path o select -unique path um Duplikate zu entfernen:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X