2009-09-30 7 views
15

Ich verwende Powershell, um meinen Quellcode für eine bestimmte Zeichenfolge zu "grep". Wenn sich die Zeichenfolge in der Datei befindet, möchte ich den Namen der Datei, nicht die Codezeile, die die Zeichenfolge enthält.Ausgabedateiname, keine Zeichenfolge mit Auswahlzeichenfolge

Ich möchte auch den Namen der Datei, nur einmal, nicht aufgeführt für so oft wie die Datei existiert.

Ich bin derzeit mit:

gci . -include "*.sql" -recurse | select-string -pattern 'someInterestingString' 

Jetzt verstehe ich, dass die Ausgabe von Select-String eine Art ojbect ist, und was ich in der Konsole zu sehen ist, vermute ich, die ToString() dieses Objekts. Ich nehme an, dass ich format-table verwenden könnte, um die Ausgabe der Auswahlzeichenfolge zu steuern, und ich nehme sort an, um nur bestimmte Werte zu erhalten.

aber das ist eine Menge zu erraten.

Antwort

32

Ich glaube nicht, dass ich völlig verstehe, was Sie versuchen zu tun. Wenn Sie die Ausgabe von Datei gruppiert werden sollen, können Sie Rohr in Format-Table mit dem -GroupBy Parameter:

gci . -include "*.sql" -recurse ` 
    | select-string -pattern 'someInterestingString' ` 
    | Format-Table -GroupBy Path 

Wenn Sie nur die Namen der Dateien erhalten möchten, die ohne weitere Informationen übereinstimmen, können Sie Select-Object mit dem Einsatz -Unique Parameter:

gci . -include "*.sql" -recurse ` 
    | select-string -pattern 'someInterestingString' ` 
    | Select-Object -Unique Path 

Wenn Sie in nur den Dateinamen interessiert sind, unabhängig davon, ob der Name selbst mehrmals in der Hierarchie angezeigt wird, dann können Sie die Filename Eigenschaft stattdessen wählen.


Hinweis: Die Get-Member Cmdlets ist eine große Hilfe, herauszufinden, welche Eigenschaften für ein Objekt vorhanden sind:

gci . -include "*.sql" -recurse ` 
    | select-string -pattern 'someInterestingString' ` 
    | Get-Member 

Sie auch gm den Alias ​​verwenden können statt.

+0

Dies ist genau die Art von detaillierten Antwort, die ich suchte. Vielen Dank! –

13

Wenn ich das tue ich nur den -Liste Parameter - ja es die Codezeile nicht angezeigt, aber Sie bekommen nur eine Zeile pro Datei (egal, wie viele Spiele gibt es):

PS> Get-ChildItem . -r *.cs | Select-String XmlNode -list 

Commands\SnapinHelp\CmdletInfo.cs:27:  public List<XmlNode> InputTypes; 
Commands\SnapinHelp\GetSnapinHelpCommand.cs:124:   WriteXmlNodeList(c... 
Commands\SnapinHelp\ParameterInfo.cs:73:  XmlNode FindNode(XmlDocument doc) 
Commands\Xml\XmlCommandBase.cs:65:   RegisterInputType<XmlNode>(Proce... 

wenn Sie den Pfad:

PS> Get-ChildItem . -r *.cs | Select-String XmlNode -list | 
    Format-Table Path 

Path 
-------- 
C:\Users\Keith\Pscx\Src\PscxSnapin\Commands\SnapinHelp\CmdletInfo.cs 
C:\Users\Keith\Pscx\Src\PscxSnapin\Commands\SnapinHelp\GetSnapinHelpCommand.cs 
C:\Users\Keith\Pscx\Src\PscxSnapin\Commands\SnapinHelp\ParameterInfo.cs 
C:\Users\Keith\Pscx\Src\PscxSnapin\Commands\Xml\XmlCommandBase.cs 

Oder wenn Sie wirklich nur den Dateinamen:

PS> Get-ChildItem . -r *.cs | Select-String XmlNode -list | 
    Format-Table Filename 

Filename 
-------- 
CmdletInfo.cs 
GetSnapinHelpCommand.cs 
ParameterInfo.cs 
XmlCommandBase.cs 
+2

Viel einfacher als die (allgemeinere) Lösung oben ... +1. –

+1

Einziger Nachteil dieses Ansatzes ist, dass wenn sich Binärdateien im Suchpfad befinden, die erste Zeile die ganze Datei sein kann. – Tolga

+0

@Tolga Um Binaries zu entfernen, verwenden Sie einfach -exclude * .dll, * .pdb, * .cache, * .exe in ** get-childitem ** oder anderen binären Erweiterungen, die angezeigt werden. – SliverNinja

1

I fand es einfacher zu tun

(...|select-string "search").Path 
+0

Dies funktioniert, aber es wird den Pfad der Datei jedes Mal zurückgeben, wenn die gesuchte Zeichenfolge in der Datei gefunden wird. – Rod