gpt4 book ai didi

powershell - Format-List -force * 不显示 .net 对象的所有成员,即使 Get-Member 确实显示它

转载 作者:行者123 更新时间:2023-12-05 01:52:44 25 4
gpt4 key购买 nike

希望有人能对此有所启发,真的很烦人。

我试图在 Powershell 7.1.3 中使用 Markdig 查找 MarkdownDocument 中的所有链接

它是为 .NET 设计的,它有一组继承类,用于表示各种类型的 Markdown 文档。我使用的是一个简单的辅助 PS 包装器,它有助于使用通用方法,但我认为这不是原因。

让我给你看一个简单的重现

install-module psmarkdig # provides the Get-MdElement helper
$doc = [Markdig.Parsers.MarkdownParser]::Parse('# blah`n`nHello [this is a link](linkpath.md)')
$links = @(Get-MdElement $doc 'Markdig.Syntax.Inlines.LinkInline') # force even a single match to be an array

好的,所以这包含一个链接

> $links.Count
1

元素是我们期望的类型

> $links[0].GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True False LinkInline Markdig.Syntax.Inlines.ContainerInline

我可以看到有一个带有 Get-Member 的 IsImage 属性

> Get-Member -InputObject $links[0]
TypeName: Markdig.Syntax.Inlines.LinkInline

Name MemberType Definition
---- ---------- ----------
AppendChild Method Markdig.Syntax.Inlines.ContainerInline AppendChild(Markdig.Syntax.Inlines.Inline child)
Clear Method void Clear()
ContainsChild Method bool ContainsChild(Markdig.Syntax.Inlines.Inline childToFind)
ContainsData Method bool ContainsData(System.Object key), bool IMarkdownObject.ContainsData(System.Object key)
ContainsParentOfType Method bool ContainsParentOfType[T]()
DumpTo Method void DumpTo(System.IO.TextWriter writer), void DumpTo(System.IO.TextWriter writer, int level)
EmbraceChildrenBy Method void EmbraceChildrenBy(Markdig.Syntax.Inlines.ContainerInline container)
Equals Method bool Equals(System.Object obj)
FindBestParent Method Markdig.Syntax.Inlines.Inline FindBestParent()
FindDescendants Method System.Collections.Generic.IEnumerable[T] FindDescendants[T]()
FindParentOfType Method System.Collections.Generic.IEnumerable[T] FindParentOfType[T]()
GetData Method System.Object GetData(System.Object key), System.Object IMarkdownObject.GetData(System.Object key)
GetEnumerator Method Markdig.Syntax.Inlines.ContainerInline+Enumerator GetEnumerator(), System.Collections.Generic.IEnumerator[Markdig.Syn…
GetHashCode Method int GetHashCode()
GetType Method type GetType()
InsertAfter Method void InsertAfter(Markdig.Syntax.Inlines.Inline next)
InsertBefore Method void InsertBefore(Markdig.Syntax.Inlines.Inline previous)
MoveChildrenAfter Method void MoveChildrenAfter(Markdig.Syntax.Inlines.Inline parent)
Remove Method void Remove()
RemoveData Method bool RemoveData(System.Object key), bool IMarkdownObject.RemoveData(System.Object key)
ReplaceBy Method Markdig.Syntax.Inlines.Inline ReplaceBy(Markdig.Syntax.Inlines.Inline inline, bool copyChildren)
SetData Method void SetData(System.Object key, System.Object value), void IMarkdownObject.SetData(System.Object key, System.Object v…
ToPositionText Method string ToPositionText()
ToString Method string ToString()
Column Property int Column {get;set;}
FirstChild Property Markdig.Syntax.Inlines.Inline FirstChild {get;}
GetDynamicUrl Property Markdig.Syntax.Inlines.LinkInline+GetUrlDelegate GetDynamicUrl {get;set;}
IsAutoLink Property bool IsAutoLink {get;set;}
IsClosed Property bool IsClosed {get;set;}
IsImage Property bool IsImage {get;set;}
IsShortcut Property bool IsShortcut {get;set;}
Label Property string Label {get;set;}
LabelSpan Property System.Nullable[Markdig.Syntax.SourceSpan] LabelSpan {get;set;}
LastChild Property Markdig.Syntax.Inlines.Inline LastChild {get;}
Line Property int Line {get;set;}
NextSibling Property Markdig.Syntax.Inlines.Inline NextSibling {get;}
Parent Property Markdig.Syntax.Inlines.ContainerInline Parent {get;}
PreviousSibling Property Markdig.Syntax.Inlines.Inline PreviousSibling {get;}
Reference Property Markdig.Syntax.LinkReferenceDefinition Reference {get;set;}
Span Property Markdig.Syntax.SourceSpan Span {get;set;}
Title Property string Title {get;set;}
TitleSpan Property System.Nullable[Markdig.Syntax.SourceSpan] TitleSpan {get;set;}
Url Property string Url {get;set;}
UrlSpan Property System.Nullable[Markdig.Syntax.SourceSpan] UrlSpan {get;set;}

但是 Format-List 给我的 View 非常有限

> Format-List -InputObject $links[0]
IsFirstCharacterEscaped : False
Parent : {this is a link}
PreviousSibling :
NextSibling :
IsClosed : False
Column : 0
Line : 0
Content : this is a link
Span : 0-0

好吧,也许有一些 FormattingTypeViews 正在发生,但即使抛出 -force -property * 和 -TheKitchenSink 似乎也没有任何区别!

> Format-List -InputObject $links[0] -Property * -Force
IsFirstCharacterEscaped : False
Parent : {this is a link}
PreviousSibling :
NextSibling :
IsClosed : False
Column : 0
Line : 0
Content : this is a link
Span : 0-0

如果我调用它,我可以看到 IsImage 的值

> $links[0].IsImage
False

如何使用 Format-List 以我在 Powershell 中惯用的正常方式探索这些对象?这是我应该以某种方式提出的 Powershell 错误吗?

最佳答案

Markdig.Syntax.Inlines.LinkInline本身实现 IEnumerable ,这导致Format-List枚举它并报告枚举元素的属性,即使通过-InputObject传递也是如此.

具体来说,它枚举实例的一个子元素,类型为Markdig.Syntax.Inlines.LiteralInline。 , 并且显示它的属性。

要防止这种枚举,即要查看实例自身的属性,您必须将其包装在 aux 中。单元素数组:

Format-List -InputObject (, $links[0])

输出:

Url             : linkpath.md
GetDynamicUrl :
Title :
Label :
IsImage : False
IsShortcut : False
IsAutoLink : False
Reference :
ParentBlock :
FirstChild : this is a link
LastChild : this is a link
Parent : {blah, Markdig.Syntax.Inlines.CodeInline, nHello , this is a link}
PreviousSibling : nHello
NextSibling :
IsClosed : True
Column : 0
Line : 0
UrlSpan : 0-0
TitleSpan : 0--1
LabelSpan : 0-0
Span : 0-0

仅获取属性 names 的一种更简单的方法是通过 intrinsic .psobject property :

$links[0].psobject.Properties.Name

注意:

  • 问题归结为 Markdig.Syntax.Inlines.LinkInline不被认为是类集合类型,但它是 IEnumerable 的实现接口(interface)使 PowerShell 将其视为一个集合。

  • 要使 .NET 类型对 PowerShell 友好,它们需要通过实现 IEnumerable属性公开枚举。 ,说 .Children在这种情况下,而不是实现 IEnumerable 他们自己

关于powershell - Format-List -force * 不显示 .net 对象的所有成员,即使 Get-Member 确实显示它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71487617/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com