如何在单个Powershell命令中使用多个函数(文件输出和删除)?
我正在使用Powershell v4.0从驱动器中删除一些重复文件并生成一些报告。我们希望没有人会在意我们删除了重复的文件,但如果他们这样做了,我就可以将文件恢复到它们的位置 我创建了一个显示所有副本的报告。我创建了一个我将保留的所有文件的报告。我创建了一个我要删除的所有文件的报告。最后我真的删除了 第一个命令是获取我拥有的所有重复文件的报告:如何在单个Powershell命令中使用多个函数(文件输出和删除)?,powershell,powershell-4.0,Powershell,Powershell 4.0,我正在使用Powershell v4.0从驱动器中删除一些重复文件并生成一些报告。我们希望没有人会在意我们删除了重复的文件,但如果他们这样做了,我就可以将文件恢复到它们的位置 我创建了一个显示所有副本的报告。我创建了一个我将保留的所有文件的报告。我创建了一个我要删除的所有文件的报告。最后我真的删除了 第一个命令是获取我拥有的所有重复文件的报告: ls *.*| Get-FileHash | group -Property hash | where { $_.count -gt 1 } | % {
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分钟,因此运行4次似乎不是一个很好的解决方案
至少,能够打印出我正在删除的内容,并在同一步骤中删除文件将是一个很好的进步。与其进行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
将哈希保存到一个变量以重用,而不是哈希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类似,我建议只获取文件和散列一次,但没有理由将整个过程循环四次。只需将所有四个命令放在一个
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对象相结合
,从而得出以下结论:
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
}
与@BenH类似,我建议只获取文件和散列一次,但没有理由将整个过程循环四次。只需将所有四个命令放在一个
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对象相结合
,从而得出以下结论:
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
}