2017-06-04 8 views
0

私はPowerShellでディレクトリを再帰的に解析し、すべてのファイルと指定された1番目のディレクトリ内のすべてのファイルからすべてのハッシュ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のバージョンは?相対パスとPSプロバイダパスをサポートする 'Get-FileHash'にすべてのファイルハッシングをオフロードすることができます。 –

+0

PS.Version:5.1.14393.1198 BuildVersion 10.0.14393.1198 –

答えて

2

のWindows 10上でPowerShellの5.1をターゲットにした場合、私はGet-FileHashコマンドレットを使用して、Group-Objectコマンドレットを使用してハッシュして、グループにそれらをしたい:

$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ハッシュを取得する方法はありますか(それはハッシュですが16進数です) –

+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 
関連する問題