我有一個PowerShell腳本正在步行目錄樹,有時候我有那些不應該被處理的硬鏈接的輔助文件。是否有一種簡單的方法來查明文件(即,System.IO.FileInfo
)是否是一個硬鏈接?找出一個文件是否是PowerShell中的符號鏈接
如果沒有,符號鏈接(符號鏈接)會更容易嗎?
我有一個PowerShell腳本正在步行目錄樹,有時候我有那些不應該被處理的硬鏈接的輔助文件。是否有一種簡單的方法來查明文件(即,System.IO.FileInfo
)是否是一個硬鏈接?找出一個文件是否是PowerShell中的符號鏈接
如果沒有,符號鏈接(符號鏈接)會更容易嗎?
試試這個:
function Test-ReparsePoint([string]$path) {
$file = Get-Item $path -Force -ea SilentlyContinue
return [bool]($file.Attributes -band [IO.FileAttributes]::ReparsePoint)
}
這是一個非常最小的實現,但它應該做的伎倆。請注意,這不區分硬鏈接和符號鏈接。在下面,他們都利用了NTFS reparse points,IIRC。
我的成績在Vista上使用基思·希爾的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
。您可以更改名稱或直接從>字符中刪除所有內容,並將其輸出到屏幕上。
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
利用Where-Object
來搜索ReparsePoint文件屬性。
Get-ChildItem | Where-Object { $_.Attributes -match "ReparsePoint" }
如果您有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:\
上運行此腳本。
硬鏈接僅僅是MFT中的附加文件條目,因此除非有人查看指向該文件的鏈接數,否則將顯示爲普通文件。但到目前爲止我沒有嘗試一個符號鏈接。確實它有ReparsePoint屬性集。謝謝。(即使符號鏈接處理起來比較麻煩,因爲我沒有默認創建它們的權限:/) – Joey 2009-05-03 21:46:25
我認爲硬鏈接和符號鏈接使用相同的機制是不正確的。正如約翰內斯指出的那樣,硬連接只是MFT中的另一個入口。符號鏈接是重新分析點。他們不同。 http://stackoverflow.com/questions/817794/find-out-whether-a-file-is-a-symlink-in-powershell/2255548#2255548 – Cheeso 2010-02-12 22:23:19