2014-02-21 4 views
5

Ich bin ein Anfänger zu Powershell und ich habe Verdacht, was ein einfaches Problem sein wird. Ich versuche, den folgenden Befehl auszuführen, aber er gibt als Ergebnis nichts zurück und ich verstehe nicht warum.Powershell Select-String nicht richtig funktioniert

Ich versuche, die Beschreibung des aktuellen Abschnitts von bcdedit zu erhalten. Wenn ich das tue:

bcdedit /enum | select-string "identifier.*current" -context 0,3 

Es gibt die folgende:

> identifier {current} 
device partition=C: 
path \WINDOWS\system32\winload.exe 
description Windows 8.1 

Warum also nicht die folgende Rückkehr description Windows 8.1?

bcdedit /enum | select-string "identifier.*current" -context 0,3 | select-string "description" 

Stattdessen gibt es nichts zurück.

Alle Informationen hierzu wären willkommen.

Antwort

7

Sie erhalten nicht das Ergebnis, das Sie erwarten, da Select-String keine Strings, sondern MatchInfo Objekte ausgibt. Wenn Sie die Ausgabe des ersten Select-String in den Get-Member oder Format-List Cmdlets, werden Sie so etwas wie diese:

 
PS C:\>bcdedit /enum | Select-String "identifier.*current" -Context 0,3 | Get-Member 

    TypeName: Microsoft.PowerShell.Commands.MatchInfo 

Name   MemberType Definition 
----   ---------- ---------- 
Equals  Method  bool Equals(System.Object obj) 
GetHashCode Method  int GetHashCode() 
GetType  Method  type GetType() 
RelativePath Method  string RelativePath(string directory) 
ToString  Method  string ToString(), string ToString(string directory) 
Context  Property Microsoft.PowerShell.Commands.MatchInfoContext Context {get;set;} 
Filename  Property string Filename {get;} 
IgnoreCase Property bool IgnoreCase {get;set;} 
Line   Property string Line {get;set;} 
LineNumber Property int LineNumber {get;set;} 
Matches  Property System.Text.RegularExpressions.Match[] Matches {get;set;} 
Path   Property string Path {get;set;} 
Pattern  Property string Pattern {get;set;} 

PS C:\>bcdedit /enum | Select-String "identifier.*current" -Context 0,3 | Format-List * 

IgnoreCase : True 
LineNumber : 17 
Line  : identifier    {current} 
Filename : InputStream 
Path  : InputStream 
Pattern : identifier.*current 
Context : Microsoft.PowerShell.Commands.MatchInfoContext 
Matches : {identifier    {current} 

Die Line Eigenschaft der tatsächliche passende Zeile enthält, und die Context Eigenschaft enthält Kind Eigenschaften mit dem pre - und nach dem Kontext. Da die description Linie für Sie suchen in der PostContext Kind Eigenschaft ist, müssen Sie so etwas wie dies zum Extrahieren dieser Linie:

bcdedit /enum | Select-String "identifier.*current" -Context 0,3 | 
    Select-Object -Expand Context | 
    Select-Object -Expand PostContext | 
    Select-String 'description' 

Fazit: Select-String richtig funktionieren. Es funktioniert einfach nicht so, wie du es erwartest.

+2

Oder etwas einfacher, könnten Sie 'out-string verwenden -stream' einige Strings select-string geben erneut zu suchen:' bcdedit/enum | select-string "Bezeichner. * Aktuell" -Kontext 0,3 | Out-String -Stream | Select-String "description" ' –

2

Select-String liefert MatchInfo Objekte, nicht nur die angezeigten String-Daten. Diese Daten stammen aus den Eigenschaften Line und Context des Objekts MatchInfo.

Versuchen Sie folgendes:

bcdedit /enum | select-string "identifier.*current" -context 0,3 | format-list 

Und Sie werden die verschiedenen Eigenschaften des MatchInfo Objekt sehen.

Beachten Sie, dass die Context Eigenschaft als Microsoft.PowerShell.Commands.MatchInfoContext angezeigt Sie werden in diesem Objekt bohren müssen weiter nach unten mehr Informationen zu bekommen:

(bcdedit /enum | select-string "identifier.*current" -context 0,3).context | format-list 

Dort werden Sie sehen, dass die context Eigenschaft ist ein weiteres Objekt mit PreContext und PostContext Eigenschaften, wo die tatsächlichen Pre und PostContext Linien sind.

So:

(bcdedit /enum | select-string "identifier.*current" -context 0,3).Context.PostContext | Select-String 'description' 

wird die Beschreibung Linie von den postcontext Matches bekommen.

Oder Sie können dies tun:

[string](bcdedit /enum | select-string "identifier.*current" -context 0,3) -split "`n" -match 'description' 
+0

reduziert es weiter auf' (bcdedit/enum | Select-String "Kennung. * Current" -Kontext 3) .Context.PostContext [2] ' –