powershell select-string无法正常工作

时间:2014-02-21 20:35:49

标签: powershell select-string

我是powershell的初学者,我怀疑这将是一个简单的问题。我正在尝试执行以下命令,但它没有返回任何结果,我不明白为什么。

我正在尝试获取bcdedit当前部分的描述。如果我这样做:

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

返回以下内容:

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

那么为什么以下不返回description Windows 8.1

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

相反,它根本不会返回任何内容。

有关此的任何信息将不胜感激。

2 个答案:

答案 0 :(得分:7)

您没有得到预期的结果,因为Select-String不输出字符串,而是输出MatchInfo个对象。如果您将第一个Select-String的输出传输到Get-MemberFormat-List cmdlet,您将得到以下内容:

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}

Line属性包含实际匹配行,Context属性包含具有前后上下文的子属性。由于您要查找的description行位于PostContext子属性中,因此您需要这样的内容来提取该行:

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

底线:Select-String确实可以正常工作。它只是按你期望的方式工作。

答案 1 :(得分:2)

Select-String返回MatchInfo个对象,而不仅仅是显示的字符串数据。该数据来自Line对象的ContextMatchInfo属性。

试试这个:

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

您将看到MatchInfo对象的各种属性。

请注意,Context属性显示为Microsoft.PowerShell.Commands.MatchInfoContext 您需要进一步深入了解此对象以获取更多信息:

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

在那里,您会看到context属性是另一个具有PreContextPostContext属性的对象,其中实际的Pre和PostContext行是。

所以:

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

将从postcontext匹配中获取描述行。

或者你可以这样做:

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