我正在使用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
我可以合并多个命令吗?每次迭代命令需要8小时30分钟,所以运行它四次并不是一个很好的解决方案。
至少能够打印出我删除的内容,并在同一步骤删除文件将是一个很好的进步。
答案 0 :(得分: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
答案 1 :(得分:2)
与@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
}