在PowerShell中有不同的方法来表示(显示)对象,但当涉及到复杂对象时,它要么非常冗长,要么毫无用处:
$Object = @{ 'a' = 1; 'b' = 2 }
只输出(Format-Host
或Format-List
)就返回多行输出,如下所示:
$Object
Name Value
---- -----
a 1
b 2
将其转换为字符串"$Object"
或$Object.ToString()
不会显示其内容的任何信息:
System.Collections.Hashtable
将其转换为Json $Object |ConvertTo-Json -Compress
,接近我希望看到的内容(但对于我所需要的内容来说,有点太具表现力的cmdlet):
{"a":1,"b":2}
我想知道是否有一种方法可以访问PowerShell显示cmdlet使用的表示格式,例如ImmediateBaseObject
和BaseObject
背后的值:
$Object.PSObject
Members : {System.Object Item(System.Object key) {get;set;}, bool IsReadOnly {get;}, bool IsFixedSize {get;}, bool IsSynchronized {get;}…}
Properties : {bool IsReadOnly {get;}, bool IsFixedSize {get;}, bool IsSynchronized {get;}, System.Collections.ICollection Keys {get;}…}
Methods : {Add, Clear, Clone, Contains…}
ImmediateBaseObject : {[a, 1], [b, 2]} # <-- This representation
BaseObject : {[a, 1], [b, 2]} #
TypeNames : {System.Collections.Hashtable, System.Object}
一厢情愿地想,我希望能够做这样的事情:
[PowerShellFormat]$Object
并为任何(复杂)对象返回相同的格式,如BaseObject
后面的$Object.PSObject
所示。
至于这个案子:
{[a, 1], [b, 2]}
2条答案
按热度按时间x4shl7ld1#
JosefZ提供了关键指针:
.GetEnumerator()
,以便枚举其 entries,这些条目是键值对,例如hashtable
示例中的[System.Collections.DictionaryEntry]
类型。[<key>, <value>]
的形式进行有意义的字符串化-尽管重要的是要注意这只是一个 * 用于显示 * 的表示,不适合 * 编程 * 处理。{...}
中,并且(字符串化的)元素用,
分隔。您可以在@{ 'a' = 1; 'b' = 2 }.psobject
的显示格式(.ImmediateBaseObject
和.BaseObject
属性)中看到这一点。注:
.GetEnumerator()
调用必须 Package 在@(...)
中以强制实际枚举,从而导致 array。获取类似的字符串表示或**
[pscustomobject]
**示例要简单得多:使用 string interpolation,即将对象嵌入到可扩展(双引号)字符串("..."
)中:注:
[pscsutomobject]
示例在可扩展字符串中以 * 相同的方式 * 进行字符串化,并作为格式化对象表示的属性。=
分隔(并且没有空格),多个属性用;
分隔,@{
作为开始分隔符。奇怪的是,这种格式与 hashtable 文字的语法非常相似。
最后,为了证明PowerShell的格式化系统确实为哈希表和
[pscustomobject]
示例生成了上面的表示,并使用 * 作为属性 *:输出:
5hcedyr02#
试试这个:
这将把a和B转换为Noteproperty名称,并带有相应的值。