如何在单个Powershell命令中使用多个函数File-Out和del?

时间:2017-03-31 18:53:12

标签: powershell powershell-v4.0

我正在使用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分钟,所以运行它四次并不是一个很好的解决方案。

至少能够打印出我删除的内容,并在同一步骤删除文件将是一个很好的进步。

2 个答案:

答案 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
}