Я использую Powershell v4.0, чтобы удалить дубликаты файлов с нашего диска и создать несколько отчетов. Мы надеемся, что никто не будет заботиться о том, что мы удаляем дубликаты файлов, но если они это сделают, я могу просто восстановить файлы в их месте.

Я создаю отчет, показывающий все дубликаты. Я создаю отчет обо всех файлах, которые буду хранить. Я создаю отчет обо всех файлах, которые буду стирать. И, наконец, я действительно делаю удаление.

Первая команда - получить отчет обо всех моих дубликатах:

ls *.*| Get-FileHash | group -Property hash | where { $_.count -gt 1 } | % { $_.group | select } | Out-File "c:\users\me\desktop\duplicatelist.txt"

Вторая команда - получить отчет обо всех файлах, которые я буду хранить:

ls *.*| Get-FileHash | group -Property hash | where { $_.count -gt 1 } | % { $_.group[0] | select } | Out-File "c:\users\me\desktop\keep.txt"

Третья команда - получить отчет обо всех файлах, которые я удалю:

ls *.*| Get-FileHash | group -Property hash | where { $_.count -gt 1 } | % { $_.group | select -skip 1} | Out-File "c:\users\me\desktop\delete.txt"

Четвертая команда - удалить все дубликаты файлов:

ls *.*| Get-FileHash | group -Property hash | where { $_.count -gt 1 } | % { $_.group | select -skip 1} | del

Могу ли я объединить несколько команд? На каждую итерацию команды уходит восемь часов тридцать минут, поэтому выполнение ее четыре раза не кажется хорошим решением.

По крайней мере, иметь возможность распечатать то, что я удаляю, и удалить файлы на одном шаге, было бы хорошим шагом вперед.

0
Kurtis AS-K 31 Мар 2017 в 21:53

2 ответа

Лучший ответ

Вместо того, чтобы хэшировать 4 раза, сохраните хэши в переменной для повторного использования:

$groupedhashes = ls *.*| Get-FileHash | group -Property hash | where { $_.count -gt 1 }

$groupedhashes | % { $_.group | select } | Out-File "c:\users\me\desktop\duplicatelist.txt"
$groupedhashes | % { $_.group[0] | select } | Out-File "c:\users\me\desktop\keep.txt"
$groupedhashes | % { $_.group | select -skip 1} | Out-File "c:\users\me\desktop\delete.txt"
$groupedhashes | % { $_.group | select -skip 1} | del
2
BenH 31 Мар 2017 в 19:20

Как и в случае @BenH, я бы посоветовал получать файлы и хэшировать только один раз, но нет причин циклически просматривать все 4 раза Просто поместите все четыре команды в один цикл ForEach.

ls *.*| Get-FileHash | group -Property hash | where { $_.count -gt 1 } | % {
    $_.group | Out-File "c:\users\me\desktop\duplicatelist.txt"
    $_.group[0] | Out-File "c:\users\me\desktop\keep.txt"
    $_.group | select -skip 1 | Out-File "c:\users\me\desktop\delete.txt"
    $_.group | select -skip 1 | del
}

Редактировать . Еще лучше: объединить две последние команды с Tee-Object, чтобы получилось следующее:

ls *.*| Get-FileHash | group -Property hash | where { $_.count -gt 1 } | % {
    $_.group | Out-File "c:\users\me\desktop\duplicatelist.txt"
    $_.group[0] | Out-File "c:\users\me\desktop\keep.txt"
    $_.group | select -skip 1 | Tee-Object -FilePath "c:\users\me\desktop\delete.txt" -Append | del
}
2
TheMadTechnician 31 Мар 2017 в 19:44