Ich verwende die folgende Liste, um rekursiv alle Dateien in einem Ordner aufzulisten, der $pattern
Aber es scheint, dass es sowohl Dateien mit dem $pattern
in seinem Namen als auch in seinem Inhalt auflistet, z.B. Wenn ich das oben ausführen wo $pattern="SAMPLE"
bekomme ich:
Jetzt:
%Vor%enthält zwar die SAMPLE Schlüsselwörter / Texte, aber das interessiert mich nicht, ich brauche nur den Befehl, um Dateinamen aufzulisten, die keine Datei mit Inhalt sind, der dem Muster entspricht. Was vermisse ich?
Basierend auf den folgenden Antworten habe ich auch versucht:
%Vor%und:
%Vor%aber es gibt keine Ergebnisse zurück.
Select-String
macht was Sie tun sagte es zu. Betonung meiner.
Das Cmdlet Select-String sucht nach Text- und Textmustern in Eingabezeichenfolgen und Dateien .
Wenn Sie also nur nach Dateinamen suchen möchten, verwenden Sie -Filter
of Get-ChildItem
oder post process mit Where-Object
Das sollte alle Dateien und Ordner zurückgeben, die ein Beispiel in ihrem Namen haben. Wenn Sie nur Dateien oder Verzeichnisse wünschen, können Sie die Schalter -File
oder -Directory
verwenden, um diese spezifischen Objekttypen zurückzugeben.
Wenn Ihr Muster komplizierter ist als ein einfaches Wort, müssen Sie möglicherweise Where-Object
wie in Itchydons Antwort verwenden mit etwas wie -match
, was dir Zugriff auf Regex gibt.
Die Gruppierungslogik in Ihrem Code sollte redundant sein, da Sie einzelne Dateien zurückgeben, die alle eindeutige Pfade haben. Deshalb habe ich das hier nicht aufgenommen. Wenn Sie nur die Pfade möchten, können Sie in Select-Object -Expand FullName
oder nur (Get-ChildItem -Path $path -Recurse -Filter "*sample*").Fullname
Komplement Matts hilfreiche Antwort :
Insbesondere, weil was Sie an Select-String
leiten, sind [System.IO.FileInfo]
objects - was Get-ChildItem
ausgibt - anstatt Strings , wird der Inhalt der von diesen Objekten dargestellten Dateien durchsucht .
Angenommen, Sie müssen nur den Dateinamen Teil des Pfads jeder Datei abgleichen und Ihr Muster kann als Platzhalterausdruck ausgedrückt werden, benötigen Sie nicht Select-String
und kann stattdessen Get-ChildItem
mit -Filter
verwenden, wie in Matts Antwort, oder die langsamere, aber etwas stärkere -Include
.
Vorbehalt :
Select-String -Pattern
akzeptiert einen regulären Ausdruck (z. B. .*sample.*
; siehe Get-Help about_Regular_Expressions
),
wobei Get-ChildItem -Filter/-Include
einen Wildcard-Ausdruck akzeptiert (zB *sample*
; siehe Get-Help about_Wildcards
) - sie sind verschiedene Dinge .
Nebenbei bemerkt: Wenn Sie nur Dateien abgleichen möchten, können Sie Get-ChildItem
anweisen, die Ausgabe auf Dateien zu beschränken (im Gegensatz zu möglicherweise auch Verzeichnissen ) mit -File
(analog können Sie die Ausgabe auf Verzeichnisse mit -Directory
beschränken).
Group-Object path
( group path
) funktioniert nicht wie vorgesehen, da die .Path
-Eigenschaft der von Select-String
ausgegebenen Match-Informationsobjekte den vollständigen Dateinamen enthält setzen Sie jede Datei in eine eigene Gruppe - im Wesentlichen ein No-Op.
Wenn Sie nur Get-ChildItem
verwenden, lautet der Name der entsprechenden Eigenschaft .FullName
. Sie suchen jedoch nach dem Pfad parent (Pfad des enthaltenden Verzeichnisses). .DirectoryName
), Nehme ich daher an:
Dies gibt den vollständigen Pfad jedes -Verzeichnisses aus, das mindestens eine Datei mit einem übereinstimmenden Dateinamen enthält.
(Beachten Sie, dass Name
in Select-Object Name
sich auf die Eigenschaft .Name
der Gruppe bezieht, die von Group-Object
zurückgegeben wird. In diesem Fall ist dies der Wert der Eigenschaft .DirectoryName
auf der Eingabeobjekte.)
Tags und Links powershell powershell-v5.0