根据 PetSerAl 的有用评论,为了补充 PetSerAl 的出色答案,重点关注不是(哈希表)的哈希表:
的输出Start-Job { New-Object PSObject } | Receive-Job -Wait -AutoRemoveJob
,
@{PSComputerName=localhost; RunspaceId=3e783d5f-254a-4951-bb4a-7ff6fa2812c5; PSShowComputerName=False; PSSourceJobInstanceId=1d951dec-0823-4cde-8219-4a6263550441}
只是看起来像一个哈希表文字;事实上,它是“无属性”自定义对象的默认输出格式,事实上,这些对象确实具有属性,但只有 PowerShell 本身添加的属性。
这种表示形式与哈希表文字可疑地相似,但是通常需要它的值周围的引用丢失了 - 例如 around localhost
。
另请注意,输出实际哈希表会产生更好的两列键值格式。
请注意,即使 PS 本身已向其添加属性后,PS 仍将原本没有属性的自定义对象视为无属性,例如通过Receive-Job
此处 - 有关详细信息,请参见下文。
在其原始状态(PS 尚未添加任何属性),无属性对象的默认输出为空 (空字符串)。(根据提示直接尝试New-Object PSCustomObject
。)
一旦Receive-Job
将其“元”属性添加到自定义对象,它们的存在就会触发类似哈希表的输出格式。
PetSerAl 提供了指向源代码的链接,这表明在以下情况下会触发“PropertyLessObject”格式:
源代码链接将告诉您在远程处理期间可能添加并触发格式化的特定 3、4 或 5 元素的远程处理属性集,但这里是一个最小的(3 属性)示例。
同样,请注意,仅触发类似哈希表的格式,因为对象具有的唯一属性是为与远程相关的自动添加的属性命名的:
PS> [PSCustomObject] @{PSComputerName='Hi, Mom'; RunspaceId=0; PSShowComputerName=$true}
@{PSComputerName=Hi, Mom; RunspaceId=0; PSShowComputerName=False}
请注意,即使命令中包含哈希表文字,它也仅用于构造自定义对象。
您可以使用or强制执行普通列表或表格视图,但请注意,布尔属性永远不会显示,而是隐式控制关联的属性是否包含在列表/表格中。Format-List -Force
Format-Table -Force
PSShowComputerName
PSComputerName
PetSerAl 还指出,您可以根据需要为任何自定义对象获取类似哈希表的输出格式:只需调用.PSObject.ToString()
(注意关键.PSObject
部分;没有它,您将得到空输出)。
PS> ([pscustomobject] @{ one = 'Hi, Mom'; two = 2 }).PSObject.ToString()
@{one=Hi, Mom; two=2}
或者,更简单地说,使用字符串插值(可能只是.PSObject.ToString()
在幕后调用):
PS> "$([pscustomobject] @{ one = 'Hi, Mom'; two = 2 })"
@{one=Hi, Mom; two=2}
请注意,这种字符串插值不适用于任何其他类型的实例(不是type 的对象[System.Management.Automation.PSCustomObject]
):
PowerShell 遵循他们的.ToString()
方法,即使您调用.PSObject.ToString()
.
默认情况下,直接基于 .NET 的类型(例如,添加Add-Type
)仅返回其完整类型名称(来自.ToString()
/.PSObject.ToString()
和 PS 中的默认输出);例如:
PS> (Add-Type -PassThru 'namespace net.same2u { public class SomeType {} }')::New()
net.same2u.SomeType # the full type name
这同样适用于自定义 PowerShell 类的实例(用 定义class { ... }
)。