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

How to use multiple functions, File-Out and del, in single Powershell command?

我正在使用 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

我可以合并多个命令吗?命令的每次迭代需要八小时三十分钟,因此 运行 四次似乎不是一个很好的解决方案。

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

与其散列 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

与@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
}