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

时间:2009-05-03 19:27:29

标签: powershell symlink hardlink

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

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

7 个答案:

答案 0 :(得分:32)

试试这个:

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

这是一个非常小的实现,但它应该做的伎俩。请注意,这不区分硬链接和符号链接。在下面,他们都利用NTFS reparse pointsIIRC

答案 1 :(得分:16)

如果您有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:\上运行此脚本。

答案 2 :(得分:14)

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

Get-ChildItem | Where-Object { $_.Attributes -match "ReparsePoint" }

答案 3 :(得分:3)

我在Vista上的结果,使用Keith Hill的powershell脚本来测试符号链接和硬链接:

c:\markus\other>mklink symlink.doc \temp\2006rsltns.doc
symbolic link created for symlink.doc <<===>> \temp\2006rsltns.doc

c:\markus\other>fsutil hardlink create HARDLINK.doc  \temp\2006rsltns.doc
Hardlink created for c:\markus\other\HARDLINK.doc <<===>> c:\temp\2006rsltns.doc

c:\markus\other>dir
 Volume in drive C has no label.
 Volume Serial Number is C8BC-2EBD

 Directory of c:\markus\other

02/12/2010  05:21 PM    <DIR>          .
02/12/2010  05:21 PM    <DIR>          ..
01/10/2006  06:12 PM            25,088 HARDLINK.doc
02/12/2010  05:21 PM    <SYMLINK>      symlink.doc [\temp\2006rsltns.doc]
               2 File(s)         25,088 bytes
               2 Dir(s)   6,805,803,008 bytes free

c:\markus\other>powershell \script\IsSymLink.ps1 HARDLINK.doc
False

c:\\markus\other>powershell \script\IsSymLink.ps1 symlink.doc
True

它表明符号链接是重新分析点,并且设置了ReparsePoint FileAttribute位,而硬链接则没有。

答案 4 :(得分:2)

以下PowerShell脚本将使用-recurse开关列出目录中的所有文件。它将列出文件的名称,无论是常规文件还是硬链接文件,以及以冒号分隔的大小。

必须从PowerShell命令行运行。在脚本中设置的目录并不重要。

它使用Windows附带的fslink实用程序,并使用硬链接和列表开关对每个文件运行,并计算输出行。如果两个或更多,它是一个硬链接文件。

您当然可以通过更改命令中的c:\windows\system来更改搜索开始的目录。此外,该脚本只是将结果写入文件c:\hardlinks.txt。您可以更改名称或只删除&gt;中的所有内容。字符打开,它将输出到屏幕。

Get-ChildItem -path C:\Windows\system -file -recurse -force | 
    foreach-object {
        if ((fsutil hardlink list $_.fullname).count -ge 2) {
            $_.PSChildname + ":Hardlinked:" + $_.Length
        } else {
            $_.PSChildname + ":RegularFile:" + $_.Length
        }
    } > c:\hardlinks.txt

答案 5 :(得分:0)

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

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

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

答案 6 :(得分:0)

这里是一种单行代码,它检查一个文件$FilePath并返回是否为符号链接,适用于文件和目录

if((Get-ItemProperty $FilePath).LinkType){"symboliclink"}else{"normal path"}