Pull to refresh

Поиск одинаковых файлов на сетевых папках используя PowerShell

Всем доброго времени суток. Привожу перевод своей статьи с сайта Sysadmin's tricks.
Я не нашел простого и бесплатного решения с GUI, как найти одинаковые файлы на сетевой шаре, поэтому, решил написать скрипт на PowerShell.

Решил искать одинаковые файлы используя значение хеша MD5. Есть два способа получения хеша MD5 в PowerShell:
1. Нужно установить библиотеку Pscx и использовать командлет Get-Hash
2. Использовать вот такую функцию:

function get-md5hash {[System.BitConverter]::ToString((new-object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider).ComputeHash([System.IO.File]::ReadAllBytes($args)))}

Далее полный листинг скрипта:
$searchpath = "\\ путь к сетевой шаре"
$savepath = "путь к сохранению csv файла"
Get-ChildItem $searchpath -Recurse|`
?{!$_.psiscontainer}|`
Select-Object Name,Fullname,CreationTime,LastWriteTime,Length,@{Name="MD5";Expression={Get-md5hash $_.fullname}}|`
group MD5|?{$_.Count -gt 1}|%{$_.Group}|sort MD5|`
Export-Csv $savepath -NoTypeInformation -Encoding "Unicode"


Объяснение:
Вычисляем MD5 хеш. Применяется ТОЛЬКО к файлам:

function get-md5hash {[System.BitConverter]::ToString((new-object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider).ComputeHash([System.IO.File]::ReadAllBytes($args)))}

Получаем список файлов:
Get-ChildItem $searchpath –Recurse

Исключая папки:
?{!$_.psiscontainer}

Перечисляем необходимые свойства, которые мы хотим видеть на выходе:
Select-Object Name,Fullname,CreationTime,LastWriteTime,Length,@{Name="MD5";Expression={Get-md5hash $_.fullname}}, где
Name — имя файла
Fullname — путь к файлу
CreationTime — дата создания файла
LastWriteTime — дата последнего изменения файла
Length — размер, в байтах

Добавляем в свойства файла значение MD5 хеша:
@{Name="MD5";Expression={Get-md5hash $_.fullname}}

Группируем файлы по MD5 хешу:
group MD5

Находим повторения:
?{$_.Count -gt 1}|%{$_.Group}

Сортируем файлы по MD5 хешу:
sort MD5

Экспортируем в .csv файл в формате Unicode:
Export-Csv $savepath -NoTypeInformation -Encoding "Unicode"

В результате у нас есть готовый файл с повторяющимися значениями хеша. Мне этого результата было достаточно, но, конечно, можно сделать намного больше, оперируя полученными результатами.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.