Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在单个Powershell命令中使用多个函数(文件输出和删除)?_Powershell_Powershell 4.0 - Fatal编程技术网

如何在单个Powershell命令中使用多个函数(文件输出和删除)?

如何在单个Powershell命令中使用多个函数(文件输出和删除)?,powershell,powershell-4.0,Powershell,Powershell 4.0,我正在使用Powershell v4.0从驱动器中删除一些重复文件并生成一些报告。我们希望没有人会在意我们删除了重复的文件,但如果他们这样做了,我就可以将文件恢复到它们的位置 我创建了一个显示所有副本的报告。我创建了一个我将保留的所有文件的报告。我创建了一个我要删除的所有文件的报告。最后我真的删除了 第一个命令是获取我拥有的所有重复文件的报告: ls *.*| Get-FileHash | group -Property hash | where { $_.count -gt 1 } | % {

我正在使用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分钟,因此运行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
}