找出文件是否是PowerShell中的符号链接
-
03-07-2019 - |
题
我有一个PowerShell脚本正在走一个目录树,有时我在那里硬链接的辅助文件不应该被处理。有没有一种简单的方法可以找出文件(即 System.IO.FileInfo
)是否是硬链接?
如果没有,用符号链接(符号链接)会更容易吗?
其他提示
如果您有Powershell 5+,则以下单行递归列出所有文件硬链接,目录连接和符号链接及其目标,从 d:\ Temp \
开始:
dir 'd:\Temp' -recurse -force | ?{如果您有Powershell 5+,则以下单行递归列出所有文件硬链接,目录连接和符号链接及其目标,从 d:\ Temp \
开始:
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 | ?{如果您有Powershell 5+,则以下单行递归列出所有文件硬链接,目录连接和符号链接及其目标,从 d:\ Temp \
开始:
dir 'd:\Temp' -recurse -force | ?{如果您有Powershell 5+,则以下单行递归列出所有文件硬链接,目录连接和符号链接及其目标,从 d:\ Temp \
开始:
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}
输出:
<*>
如果您关心硬链接的多个目标,请使用此变体列出以标签分隔的目标:
<*>
您可能需要管理员权限才能在 C:\
。
上运行此脚本.LinkType} | select FullName,LinkType,Target
输出:
<*>
如果您关心硬链接的多个目标,请使用此变体列出以标签分隔的目标:
<*>
您可能需要管理员权限才能在 C:\
。
上运行此脚本.LinkType} | select FullName,LinkType,@{ Name = "Targets"; Expression={如果您有Powershell 5+,则以下单行递归列出所有文件硬链接,目录连接和符号链接及其目标,从 d:\ Temp \
开始:
dir 'd:\Temp' -recurse -force | ?{如果您有Powershell 5+,则以下单行递归列出所有文件硬链接,目录连接和符号链接及其目标,从 d:\ Temp \
开始:
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}
输出:
<*>
如果您关心硬链接的多个目标,请使用此变体列出以标签分隔的目标:
<*>
您可能需要管理员权限才能在 C:\
。
上运行此脚本.LinkType} | select FullName,LinkType,Target
输出:
<*>
如果您关心硬链接的多个目标,请使用此变体列出以标签分隔的目标:
<*>
您可能需要管理员权限才能在 C:\
。
上运行此脚本.Target -join "`t"} }
如果您关心硬链接的多个目标,请使用此变体列出以标签分隔的目标:
<*>
您可能需要管理员权限才能在 C:\
。
上运行此脚本.LinkType} | select FullName,LinkType,Target
输出:
<*>如果您关心硬链接的多个目标,请使用此变体列出以标签分隔的目标:
<*>您可能需要管理员权限才能在 C:\
。
利用 Where-Object
搜索ReparsePoint文件属性。
Get-ChildItem | Where-Object { 利用 Where-Object
搜索ReparsePoint文件属性。
<*>.Attributes -match "ReparsePoint" }
我在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位,而硬链接则没有。
以下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 以下PowerShell脚本将使用-recurse开关列出目录中的所有文件。它将列出文件的名称,无论是常规文件还是硬链接文件,以及以冒号分隔的大小。
必须从PowerShell命令行运行。使用哪个目录与脚本中设置的目录无关。
它使用Windows附带的fslink实用程序,并使用硬链接和列表开关对每个文件运行,并计算输出行。如果两个或更多,它是一个硬链接文件。
您当然可以通过更改命令中的 c:\ windows \ system
来更改搜索开始的目录。此外,该脚本只是将结果写入文件 c:\ hardlinks.txt
。您可以更改名称或只删除&gt;中的所有内容。字符打开,它将输出到屏幕。
<*>.fullname).count -ge 2) {
以下PowerShell脚本将使用-recurse开关列出目录中的所有文件。它将列出文件的名称,无论是常规文件还是硬链接文件,以及以冒号分隔的大小。
必须从PowerShell命令行运行。使用哪个目录与脚本中设置的目录无关。
它使用Windows附带的fslink实用程序,并使用硬链接和列表开关对每个文件运行,并计算输出行。如果两个或更多,它是一个硬链接文件。
您当然可以通过更改命令中的 c:\ windows \ system
来更改搜索开始的目录。此外,该脚本只是将结果写入文件 c:\ hardlinks.txt
。您可以更改名称或只删除&gt;中的所有内容。字符打开,它将输出到屏幕。
<*>.PSChildname + ":Hardlinked:" + 以下PowerShell脚本将使用-recurse开关列出目录中的所有文件。它将列出文件的名称,无论是常规文件还是硬链接文件,以及以冒号分隔的大小。
必须从PowerShell命令行运行。使用哪个目录与脚本中设置的目录无关。
它使用Windows附带的fslink实用程序,并使用硬链接和列表开关对每个文件运行,并计算输出行。如果两个或更多,它是一个硬链接文件。
您当然可以通过更改命令中的 c:\ windows \ system
来更改搜索开始的目录。此外,该脚本只是将结果写入文件 c:\ hardlinks.txt
。您可以更改名称或只删除&gt;中的所有内容。字符打开,它将输出到屏幕。
<*>.Length
} else {
以下PowerShell脚本将使用-recurse开关列出目录中的所有文件。它将列出文件的名称,无论是常规文件还是硬链接文件,以及以冒号分隔的大小。
必须从PowerShell命令行运行。使用哪个目录与脚本中设置的目录无关。
它使用Windows附带的fslink实用程序,并使用硬链接和列表开关对每个文件运行,并计算输出行。如果两个或更多,它是一个硬链接文件。
您当然可以通过更改命令中的 c:\ windows \ system
来更改搜索开始的目录。此外,该脚本只是将结果写入文件 c:\ hardlinks.txt
。您可以更改名称或只删除&gt;中的所有内容。字符打开,它将输出到屏幕。
<*>.PSChildname + ":RegularFile:" + 以下PowerShell脚本将使用-recurse开关列出目录中的所有文件。它将列出文件的名称,无论是常规文件还是硬链接文件,以及以冒号分隔的大小。
必须从PowerShell命令行运行。使用哪个目录与脚本中设置的目录无关。
它使用Windows附带的fslink实用程序,并使用硬链接和列表开关对每个文件运行,并计算输出行。如果两个或更多,它是一个硬链接文件。
您当然可以通过更改命令中的 c:\ windows \ system
来更改搜索开始的目录。此外,该脚本只是将结果写入文件 c:\ hardlinks.txt
。您可以更改名称或只删除&gt;中的所有内容。字符打开,它将输出到屏幕。
<*>.Length
}
} > c:\hardlinks.txt