我是powershell的初学者,我怀疑这将是一个简单的问题。我正在尝试执行以下命令,但结果一无所获,我不明白为什么。
我正在尝试获得bcdedit当前节的描述。如果我这样做:
bcdedit /enum | select-string "identifier.*current" -context 0,3
它返回以下内容:
> identifier {current}
device partition=C:
path WINDOWSsystem32winload.exe
description Windows 8.1
那么,为什么以下不返回description Windows 8.1
呢?
bcdedit /enum | select-string "identifier.*current" -context 0,3 | select-string "description"
相反,它什么也不回。
如有任何相关信息,我们将不胜感激。
您没有得到预期的结果,因为Select-String
不输出字符串,而是输出MatchInfo
对象。如果将第一个Select-String
的输出通过管道传输到Get-Member
或Format-List
cmdlet中,则会得到以下内容:
PS C:\>bcdedit/enum |选择字符串"identifier.*current"-Context 0,3|获取成员TypeName:Microsoft。PowerShell。命令。MatchInfo名称成员类型定义------------------------------Equals方法bool Equals(System.Object obj)GetHashCode方法int GetHashCode()GetType方法类型GetType()RelativePath方法字符串RelativePth(字符串目录)ToString方法string ToString(),字符串ToString(字符串目录)上下文属性Microsoft。PowerShell。命令。MatchInfoContext上下文{get;set;}文件名属性字符串文件名{get;}IgnoreCase属性布尔IgnoreCcase{get;set;}Line属性字符串Line{get;set;}LineNumber属性int LineNumber{get;set;}匹配属性系统。文本RegularExpressions。Match[]匹配{get;set;}Path属性字符串Path{get;set;}Pattern属性字符串Pattern{get;set;}PS C:\>bcdedit/enum |选择字符串"identifier.*current"-Context 0,3|格式列表*IgnoreCase:True行号:17行:标识符{current}文件名:InputStream路径:InputStream模式:identifier.*current上下文:Microsoft。PowerShell。命令。MatchInfoContext匹配:{identifier{current}
Line
属性包含实际的匹配行,Context
属性包含具有pre和post上下文的子属性。由于您要查找的description
行位于PostContext
子属性中,因此提取该行需要这样的东西:
bcdedit /enum | Select-String "identifier.*current" -Context 0,3 |
Select-Object -Expand Context |
Select-Object -Expand PostContext |
Select-String 'description'
一句话:Select-String
确实工作正常。它只是没有按你期望的方式工作。
Select-String
返回MatchInfo
对象,而不仅仅是显示的字符串数据。该数据取自MatchInfo
对象的Line
和Context
属性。
试试这个:
bcdedit /enum | select-string "identifier.*current" -context 0,3 | format-list
您将看到MatchInfo
对象的各种属性。
请注意,Context
属性显示为Microsoft。PowerShell。命令。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'