powershell选择字符串工作不正常



我是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-MemberFormat-Listcmdlet中,则会得到以下内容:

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对象的LineContext属性。

试试这个:

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属性是另一个具有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'

相关内容

  • 没有找到相关文章

最新更新