Ich habe vor ein paar Tagen angefangen, Powershell zu lernen, und ich konnte auf Google nichts finden, was das tut, was ich brauche. Bitte tragen Sie meine Frage.
Ich wurde gebeten, einige Textzeichenfolgen in mehrere Dateien zu ersetzen. Ich kenne nicht unbedingt die Erweiterung der möglichen Zieldateien und ich kenne auch nicht deren Speicherort. Bisher habe ich es geschafft, rekursiv in das Verzeichnis ( get-ChildItem -recurse
) zu navigieren und die gesuchte Zeichenfolge mit get-content und select-string zu finden:
Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy"
Das Problem ist, dass ich das Vorkommen des gesuchten Textes sehen kann, aber ich weiß nicht, wie ich PS anweisen soll, den Pfad und den Namen für jede übereinstimmende Datei zurückzugeben.
Wie kann ich den Namen und den Speicherort der Dateien ermitteln, die den gesuchten Ausdruck enthalten?
Antworten:
Dies sollte den Speicherort der Dateien angeben, die Ihr Muster enthalten:
quelle
name
Parameter. Versuchen Sie hinzuzufügen| %{Move-Item $_.name <destination>}
Get-ChildItem -Recurse | Select-String "dummy" -List | Select Path
Gibt nur die erste Übereinstimmung für jede Datei zurück, ist also möglicherweise etwas effizienter und vermeidet die Notwendigkeit, sie zu gruppierentxt
Dateien, wenn SieGet-ChildItem -Recurse -Filter *.txt
stattdessen verwendenforeach
Schleife schreiben, wenn Sie große Operationen wie diese ausführen. Es wird sehr kompliziert, wenn Sie versuchen, all das in einer Zeile zu tun, und es ist sehr leicht, einen großen Fehler zu machen. Ich spreche aus ErfahrungHier gibt es eine Vielzahl genauer Antworten, aber hier ist der prägnanteste Code für verschiedene Variationen. Für jede Variation zeigt die obere Zeile die vollständige Syntax und die untere die knappe Syntax.
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.
Listen Sie FileInfo- Objekte für alle Dateien auf, die Muster enthalten:
Listen Sie Dateinamen für alle Dateien auf, die Muster enthalten:
Listen Sie FileInfo- Objekte für alle Dateien auf, die kein Muster enthalten:
Listen Sie Dateinamen für alle Dateien auf, die kein Muster enthalten:
quelle
-List
ParameterSelect-String
Dadurch werden der Pfad, der Dateiname und die gefundene Inhaltszeile angezeigt, die dem Muster entsprechen.
quelle
Pipe den Inhalt von Ihrem
zu
fl *
Sie werden sehen, dass der Pfad bereits als Eigenschaft der Objekte zurückgegeben wird.
Wenn Sie nur den Pfad möchten, verwenden
select path
oderselect -unique path
entfernen Sie Duplikate:quelle
-File
Schalter hinzufügen, sonst kommt es zuGet-ChildItem
einer nie endenden Fehlerkaskade , wenn Sie versuchen,Get-Content
Verzeichnisse aufzurufen .(Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy").FullName
Leute scheinen zu vergessen, dass PowerShell objektorientiert ist. Wenn Sie Zweifel haben, suchen Sie nach einer ImmobilieSo würde ich es machen, du brauchst keinen Get-Content:
oder
Um zu sehen, was die verschiedenen Eigenschaften sind ...
Das geht schneller. Das zweite Argument ist -filter:
quelle
select Pattern, LineNumber, Filename
für eine präzisere Ausgabe. Zeile gibt ALLES in der Zeile zurück, die Ihre Musterzeichenfolge enthält. Sie können dies auch einfach auf eine CSV ausgeben, wenn Sie möchten.Dadurch erhalten Sie alle Details aller Dateien
quelle
-r
funktioniert. Ich dachte, du musst es immer tun-Recurse
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 nicht gut zu funktionieren schien):
oder kurz:
quelle
Wenn Sie in einem Verzeichnis suchen, können Sie dies tun:
quelle
Daraufhin wird eine Liste des vollständigen Pfads zu jeder Datei angezeigt, die die Suchzeichenfolge enthält:
Beachten Sie, dass keine Überschrift über den Ergebnissen und keine Textzeilen mit der Suchzeichenfolge angezeigt werden. Sie erfahren lediglich, wo Sie die Dateien finden, die die Zeichenfolge enthalten.
quelle
Ich habe eine der obigen Antworten geändert, um ein bisschen mehr Informationen zu erhalten. Dies ersparte mir später eine zweite Frage. Es war ungefähr so:
Ich kann den Pfad und die Datei-Platzhalter mit diesen Strukturen angeben und es speichert den Dateinamen, die Zeilennummer und die relevante Zeile in einer Ausgabedatei.
quelle