2017-06-04 39 views
0

我想在PowerShell中創建一個分析recursevily目錄的腳本,並從第一個目錄中的所有文件和所有文件中的所有文件獲取所有哈希MD5。在Powershell中查找文件副本的腳本

之後,我想比較對方之間的所有散列,看看哪一個是副本,然後給出一個選項來刪除這些副本或不。

目前,我有這樣的:

$UserInput=Read-Host 
Get-ChildItem -Path $UserInput -Recurse 
$someFilePath = $UserInput 
$md5 = New-Object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider 
$hash = [System.BitConverter]::ToString($md5.ComputeHash([System.IO.File]::ReadAllBytes($someFilePath))) 
$hash 

的主要問題是在散列部,我在調用「ReadAllBytes」得到一個錯誤。

我也懷疑如果創建一個數組,所以當我比較散列時,如果它們相等,則將副本放在數組中,因此刪除它們「更容易」。

您認爲如何? (我也不確定我是否正確使用「SomeFilePath」,MD5或哈希)。

+0

您定位的是哪個版本的PowerShell?您可以將所有文件哈希卸載到'Get-FileHash',它將支持相對路徑和PS提供程序路徑。 –

+0

PS.Version:5.1.14393.1198 BuildVersion 10.0.14393.1198 –

回答

2

如果在Windows 10個指定的PowerShell 5.1,我會使用Group-Object cmdlet的使用它們的Get-FileHash小命令,然後按哈希:

$UserInput = Read-Host 
$DuplicateFiles = Get-ChildItem -Path $UserInput -Recurse -File |Group {($_|Get-FileHash).Hash} |Where Count -gt 1 
foreach($FileGroup in $DuplicateFiles) 
{ 
    Write-Host "These files share hash $($FileGroup.Name)" 
    $FileGroup.Group.FullName |Write-Host 
} 
1

試試這個:

$fileHashes = Get-ChildItem -Path $myFilePath -Recurse -File | Get-Filehash -Algorithm MD5 
$doubles = $fileHashes | Group hash | ? {$_.count -gt 1} | % {$_.Group} 

foreach($item in $doubles) { 
    Write-Output $item 
} 
+0

很棒!謝謝!有沒有辦法獲得MD5散列(這是哈希,但十六進制) –

+1

是的,我更新了這篇文章。 – k7s5a

0

只要做到這一點

Get-ChildItem -Path $UserInput -Recurse -File | Get-FileHash | Group Hash | Where Count -gt 1 

簡短版本:

gci -Path $UserInput -R -File | Get-FileHash | Group Hash | ? Count -gt 1