找出文件是否是PowerShell中的符号链接

Joe*_*oey 24 powershell symlink hardlink

我有一个PowerShell脚本,它正在走一个目录树,有时我在那里硬链接的辅助文件不应该被处理.有没有一种简单的方法可以找出文件(即System.IO.FileInfo)是否是硬链接?

如果没有,用符号链接(符号链接)会更容易吗?

Kei*_*ill 34

试试这个:

function Test-ReparsePoint([string]$path) {
  $file = Get-Item $path -Force -ea SilentlyContinue
  return [bool]($file.Attributes -band [IO.FileAttributes]::ReparsePoint)
}
Run Code Online (Sandbox Code Playgroud)

这是一个非常小的实现,但它应该做的伎俩.请注意,这不区分硬链接和符号链接.在下面,他们都只利用NTFS重新分析点,IIRC.

  • 我认为硬链接和符号链接使用相同的机制并不正确.正如约翰内斯指出的那样,硬链接只是MFT中的另一个条目.符号链接是重新分析点.他们是不同的.http://stackoverflow.com/questions/817794/find-out-whether-a-file-is-a-symlink-in-powershell/2255548#2255548 (2认同)

Ant*_*lov 19

如果您有Powershell 5+,则以下单行递归列出所有文件硬链接,目录连接和符号链接及其目标,从d:\Temp\以下开始:

dir 'd:\Temp' -recurse -force | ?{$_.LinkType} | select FullName,LinkType,Target
Run Code Online (Sandbox Code Playgroud)

输出:

FullName                                LinkType     Target
--------                                --------     ------
D:\Temp\MyJunctionDir                   Junction     {D:\exp\junction_target_dir}
D:\Temp\MySymLinkDir                    SymbolicLink {D:\exp\symlink_target_dir}
D:\Temp\MyHardLinkFile.txt              HardLink     {D:\temp\MyHardLinkFile2.txt, D:\exp\hlink_target.xml}
D:\Temp\MyHardLinkFile2.txt             HardLink     {D:\temp\MyHardLinkFile.txt, D:\exp\hlink_target.xml}
D:\Temp\MySymLinkFile.txt               SymbolicLink {D:\exp\symlink_target.xml}
D:\Temp\MySymLinkDir\MySymLinkFile2.txt SymbolicLink {D:\temp\normal file.txt}
Run Code Online (Sandbox Code Playgroud)

如果您关心硬链接的多个目标,请使用此变体列出以制表符分隔的目标:

dir 'd:\Temp' -recurse -force | ?{$_.LinkType} | select FullName,LinkType,@{ Name = "Targets"; Expression={$_.Target -join "`t"} }
Run Code Online (Sandbox Code Playgroud)

您可能需要管理员权限才能运行此脚本C:\.

  • 对于重分析点,“LinkType”似乎并不可靠。例如,在我的运行 W10 和 PS 5.1 的计算机上,“C:\ProgramData\Desktop”和“C:\Users\All Users”的“LinkType”均为空,而“dir /aL”(命令提示符,而不是 PowerShell) ) 表示第一个是连接点,第二个是符号链接。 (3认同)
  • 截至撰写本文时,Windows Powershell Core 6.2.3 上的目标数组始终为空。也许PS 7会恢复它。 (2认同)

jzs*_*-sz 17

对于那些想要检查资源是否是硬链接或符号链接的人:

(Get-Item ".\some_resource").LinkType -eq "HardLink"

(Get-Item ".\some_resource").LinkType -eq "SymbolicLink"
Run Code Online (Sandbox Code Playgroud)


小智 14

利用Where-Object搜索的ReparsePoint文件属性.

Get-ChildItem | Where-Object { $_.Attributes -match "ReparsePoint" }
Run Code Online (Sandbox Code Playgroud)