我有一个遍历目录树的PowerShell脚本,有时我有一些硬链接的辅助文件,这些文件不应该被处理。有没有一种简单的方法来确定一个文件(即System.IO.FileInfo
)是否是硬链接?
如果不是,使用符号链接(Symlink)会更容易吗?
发布于 2009-05-03 21:32:14
试试这个:
function Test-ReparsePoint([string]$path) {
$file = Get-Item $path -Force -ea SilentlyContinue
return [bool]($file.Attributes -band [IO.FileAttributes]::ReparsePoint)
}
这是一个相当小的实现,但它应该可以做到这一点。请注意,这不区分硬链接和符号链接。在本质上,它们都只是利用了NTFS reparse points,IIRC。
发布于 2017-02-08 23:39:05
如果您有Powershell 5+,下面的一行程序会递归地列出从d:\Temp\
开始的所有文件硬链接、目录连接和符号链接及其目标
dir 'd:\Temp' -recurse -force | ?{$_.LinkType} | select FullName,LinkType,Target
输出:
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}
如果您关心硬链接的多个目标,请使用此变体,它列出了以制表符分隔的目标:
dir 'd:\Temp' -recurse -force | ?{$_.LinkType} | select FullName,LinkType,@{ Name = "Targets"; Expression={$_.Target -join "`t"} }
您可能需要管理员权限才能在C:\
上运行此脚本。
发布于 2015-12-31 00:59:04
利用Where-Object
搜索ReparsePoint文件属性。
Get-ChildItem | Where-Object { $_.Attributes -match "ReparsePoint" }
https://stackoverflow.com/questions/817794
复制相似问题