奇怪的Get-Item行为

时间:2018-05-31 12:09:31

标签: powershell registry

如果我只是做

Get-Item "HKLM:\SOFTWARE\MozillaPlugins\@microsoft.com/GENUINE"

我在控制台上得到了这个

NAME
----
@microsoft.com/GENUINE

但是,这个

$test = Get-Item "HKLM:\SOFTWARE\MozillaPlugins\@microsoft.com/GENUINE"
Write-Host "$($test.name)"

返回完整路径,而不仅仅是密钥的名称。

这是一个错误吗?预期的行为?我做错了什么?

1 个答案:

答案 0 :(得分:4)

  

这是一个错误吗?预期的行为?我做错了什么?

中间人。

PowerShell格式化文件(默认情况下位于$pshome中定义的目录中的* .format.ps1xml)解释了这里的区别。在默认输出方案中,PowerShell会检查已知格式定义,这些定义是从上述文件加载的,用于给定的对象类型。如果存在,它将使用那些来管理哪些数据以及如何输出数据。

因此,在您的情况下,您有Microsoft.Win32.RegistryKey个对象。其格式定义存储在registry.format.ps1xml中。只是显示该文件的截断部分,以便您可以看到如何创建顶部示例。

 .... output truncated ....
 <TableControl>
                <TableHeaders>
                   <TableColumnHeader>
                        <Width>30</Width>
                        <Label>Name</Label>
                    </TableColumnHeader>
                    <TableColumnHeader>
                      <Label>Property</Label>
                    </TableColumnHeader>
                </TableHeaders>
                <TableRowEntries>
                    <TableRowEntry>
                      <Wrap/>
                        <TableColumnItems>
                            <TableColumnItem>
                                <PropertyName>PSChildName</PropertyName>
.... output truncated ....

因此,这定义了一个包含2列的输出表:name,property。 name列实际上是对象pschildname属性。这与对象的实际名称属性是分开的。这就是为什么你得到你上面看到的差异。

在PS世界中也有其他这种误解的例子。你知道的越多。

格式化文件的首选资源是about_format.ps1xml。如果您对默认格式有疑问并且对简单Select-Object不满意,那么您可以从副本创建自己的格式。

FWIW你可以通过像

那样找到这两个属性
Get-Item "HKLM:\SOFTWARE\MozillaPlugins\@microsoft.com/GENUINE" |  Format-List *

这会强制显示所有属性,您会看到namepschildname