我是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"
相反,它根本不会返回任何内容。
有关此的任何信息将不胜感激。
答案 0 :(得分:7)
您没有得到预期的结果,因为Select-String
不输出字符串,而是输出MatchInfo
个对象。如果您将第一个Select-String
的输出传输到Get-Member
或Format-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
对象的Context
和MatchInfo
属性。
试试这个:
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
属性是另一个具有PreContext
和PostContext
属性的对象,其中实际的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'