检索默认属性名称

时间:2016-07-01 05:45:05

标签: powershell

以下命令:

Get-ChildItem | Get-Member

表明System.IO.DirectoryInfoSystem.IO.FileInfo上有很多属性。

但是,以交互方式运行时,仅显示属性ModeLastWriteTimeLengthName。这些也是Get-ChildItem通过管道传送到Format-TableOut-GridView时显示的属性。

我的问题是,有没有办法以编程方式为任何给定对象获取这些默认属性的名称?即像这样的东西:

Get-DefaultProperties @(Get-ChildItem)[0]

应在数组中返回以下内容:Mode LastWriteTime Length Name

3 个答案:

答案 0 :(得分:3)

内置解决方案

以下是访问默认属性的简单,编程方式。

(Get-Item -Path $FolderPath).PSStandardMembers   

结果输出将是 DefaultDisplayProperty DefaultDisplayPropertySet

DefaultDisplayProperty  
----------------------   
Name

PSStandardMembers {DefaultDisplayPropertySet}    

在第二种情况下,您可以访问基础属性,如下所示:

(Get-Item -Path $FilePath).PSStandardMembers.DefaultDisplayPropertySet   
ReferencedPropertyNames : {LastWriteTime, Length, Name}  
MemberType              : PropertySet   
Value                   : DefaultDisplayPropertySet {LastWriteTime, Length, Name}   
TypeNameOfValue         : System.Management.Automation.PSPropertySet   
Name                    : DefaultDisplayPropertySet   
IsInstance              : False   

然后,您可以使用点符号直接进入 ReferencedPropertyNames 数组。

答案 1 :(得分:2)

要了解PowerShell输出的对象属性,您应该阅读 about_Types.ps1xml

  

Windows PowerShell安装目录中的Types.ps1xml文件   ($ pshome)是一个基于XML的文本文件,可以让你添加属性和   Windows PowerShell中使用的对象的方法。视窗   PowerShell具有内置的Types.ps1xml文件,可添加多个元素   到.NET Framework类型,但您可以创建其他类型   Types.ps1xml文件进一步扩展了类型。

例如,您会在PowerShell目录(FileSystem.format.ps1xml)中找到%windir%\system32\WindowsPowerShell\v1.0\,其中包含System.IO.DirectoryInfo的定义:

<TableColumnItems>
    <TableColumnItem>
        <PropertyName>Mode</PropertyName>
    </TableColumnItem>
    <TableColumnItem>
        <ScriptBlock>
            [String]::Format("{0,10}  {1,8}", $_.LastWriteTime.ToString("d"), $_.LastWriteTime.ToString("t"))
        </ScriptBlock>
    </TableColumnItem>
    <TableColumnItem>
    <PropertyName>Length</PropertyName>
    </TableColumnItem>
    <TableColumnItem>
        <PropertyName>Name</PropertyName>
    </TableColumnItem>
</TableColumnItems>

但是对于你的问题,除了解析ps1xml之外,我还不知道一种干净的程序化方式来获得&#34;默认&#34;属性。您可以选择所需对象的第一个元素,并使用Out-String获取可以解析的字符串:

((((Get-ChildItem)[0]) | out-string).Trim() -split "`n" | select -index 3).Trim() -split '\s+'

<强>输出:

Mode
LastWriteTime
Length
Name

请注意,这可能不适用于其他对象......

答案 2 :(得分:1)

Get-childitem会根据您的位置生成不同类型的对象。如果您在注册表中,它将生成RegistryKey对象,而如果您在文件系统中,则将获得FileInfo或DirectoryInfo对象。

FileSystem.Format.ps1xml文件(可在$pshome中找到)定义文件系统对象(如文件和目录对象)的显示。如果您查看ViewDefinitions,您将找到默认格式化程序使用的值。

据我所知,没有&#34;解析&#34;没有找到这些默认值的方法。那个文件,但我可能是错的。