Listet Dateinamen in einem Ordner auf, der mit einem Muster übereinstimmt, wobei der Dateiinhalt ausgeschlossen wird

8

Ich verwende die folgende Liste, um rekursiv alle Dateien in einem Ordner aufzulisten, der $pattern

enthält %Vor%

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:

%Vor%

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.

    
u123 29.06.2017, 12:55
quelle

3 Antworten

12

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

%Vor%

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

pipen     
Matt 29.06.2017, 13:17
quelle
5

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:

%Vor%

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.)

    
mklement0 29.06.2017 14:01
quelle
1
%Vor%     
Itchydon 29.06.2017 13:06
quelle

Tags und Links