简述:
ETS(扩展类型系统)成员(如.Target
)没有文档。
c:\windows\System32\atl.dll
是两个所谓的硬链接之一,它们指向相同的文件数据(另一个是C:\Windows\WinSxS\amd64_microsoft-windows-atl_31bf3856ad364e35_10.0.18362.1_none_7d7dafc1d6eadbc7\atl.dll
)。
- 对于硬链接,
.Target
报告所有其他硬链接(指向同一文件的路径),这就是为什么两个项目的.Target
属性值分别指向另一个路径的原因。
您的代码在PowerShell [Core]中不再起作用,因为通过.Target
报告硬链接的支持已被删除 - 请参阅this GitHub issue。
如Mathias R. Jessen所指出的那样,
.Target
属性是
ETS(扩展类型系统)属性——PowerShell添加的一种属性,用于扩展本机.NET类型的功能。
这些ETS成员(也可能包括方法)
没有文档可供参考——您最好的选择是研究它们的
定义,但这并不能保证您能获得完整的信息,或者需要付出相当大的努力:
首先,您可以使用
Get-TypeData
cmdlet来检查
.Target
属性的定义(该属性添加到
System.IO.FileInfo
和
System.IO.DirectoryInfo
实例中)。
PS> (Get-TypeData System.IO.FileInfo).Members.Target | foreach GetCodeReference
Name : GetTarget
DeclaringType : Microsoft.PowerShell.Commands.InternalSymbolicLinkLinkCodeMethods
[...]
MemberType : Method
ReturnType : System.Collections.Generic.IEnumerable`1[System.String]
[...]
"
Get-Item $PROFILE | Get-Member Target
也可以用,但在这种情况下缺少重要信息:属性.Target
是CodeProperty
类型,即其值由调用.NET类型的静态方法确定,但输出的.Definition
属性仅显示该方法为 Target{get=GetTarget;}
;即完整的类型名丢失了。
也就是说,使用手头的System.IO.DirectoryInfo
实例调用[Microsoft.PowerShell.Commands.InternalSymbolicLinkLinkCodeMethods]::GetTarget()
来返回该实例的.Target
属性值。
"
接下来讨论了 .Target
的部分推断行为。
.Target
的目的和行为:
.Target
属性返回文件系统的重解析点(Windows)/ 符号链接(symbolic link's;Unix)目标路径。[1]
如果输入路径不是重解析点或符号链接,则.Target
返回“nothing”:具体来说,是[System.Management.Automation.Internal.AutomationNull] ::Value
(Windows PowerShell;在大多数情况下的行为类似于$null
)/ $null
(PowerShell [Core])。
.Target
在Windows PowerShell和PowerShell [Core] 6+(PowerShell 7.0)之间的行为有重要的差异:
在Windows PowerShell中,
.Target
返回一个目标路径的
枚举,这意味着可能会返回
多个路径,仅当输入路径是指向同一
文件(数据)的几个
硬链接之一时才适用。
具体来说,硬链接的
.Target
属性报告了所有存在于该文件的其他
硬链接(即不包括输入路径)。
这就解释了为什么对于具有
两个硬链接的文件,它们的
.Target
属性指向各自的另一个路径,例如指向硬链接
C:\Windows\System32\atl.dll
所指向的文件。
在PowerShell [Core]中,
.Target
仅返回一个
单一路径,因为
已删除对硬链接的支持 - 参见
this GitHub issue。
顺便说一下:与Windows不同,类Unix平台没有系统级别的支持来枚举硬链接,因此查找给定文件的所有硬链接既麻烦又慢。
除了硬链接之外,类Unix平台只有符号链接,而在Windows上,
重新解析点的类别不仅包括符号链接,还包括连接点、卷挂载点以及在最近的Windows版本中出现的AppX重新解析点(用于Microsoft Store应用程序的应用执行别名)。
$PSHOME\typesv3.ps1xml
。 - Mathias R. JessenGet-Member
。 - RoadRunnerTarget
是从哪里来的了,但每个目标为什么都指向彼此的目标仍然是个谜。 - René Nyffenegger