PowerShell中Get-ChildItem的Mode显示属性源自何处?
关于Get-ChildItem输出中Mode列来源的疑问
作为Jacek提出的「获取命令结果标题名称」问题的延伸,我已经在对应回答里解释了通用的DefaultDisplayPropertySet概念,但搞不懂Dir(也就是Get-ChildItem)命令输出里为啥会显示Mode这一列:
Get-ChildItem Directory: C:\Path Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 9/7/2023 11:07 AM 383 Test.txt
因为执行下面这条命令,输出里根本没列出Mode属性:
(Get-ChildItem -File)[0].PSStandardMembers.DefaultDisplayPropertySet.ReferencedPropertyNames LastWriteTime Length Name
有没有人能解释下这个Mode列到底是哪来的?
解答:Mode列的来源
Get-ChildItem输出里的Mode列,并不是从对象的DefaultDisplayPropertySet来的,而是PowerShell通过预设的格式化文件定义的。
PowerShell为不同类型的对象提前写好了展示规则,这些规则存在.ps1xml格式的文件里。对于Get-ChildItem返回的FileInfo和DirectoryInfo对象,对应的规则在FileSystem.Format.ps1xml文件中。
在这个文件的视图定义里,明确给FileInfo和DirectoryInfo加了Mode列——这个Mode并不是对象本身的固有属性,而是PowerShell动态给文件系统对象加上的脚本属性,用来简洁展示文件/目录的权限、特性(比如只读、隐藏、归档之类的)。
你可以用这条命令查看这个动态属性的定义:
(Get-ChildItem -File)[0] | Get-Member -Name Mode
输出会显示Mode是一个ScriptProperty,它的值是通过脚本块计算出来的,不是直接存在对象的属性集合里,所以自然不会出现在DefaultDisplayPropertySet.ReferencedPropertyNames的结果中。
内容的提问来源于stack exchange,提问作者iRon
相关产品推荐
相关产品推荐

