Powershell 显示重复文件

Tej*_*554 2 powershell

我有一项任务是检查当天是否在共享位置文件夹中导入了新文件,并提醒是否有任何重复文件并且不需要递归检查。

下面的代码显示大小为 1 天的所有文件详细信息但是我只需要大小相同的文件,因为我无法使用名称比较它们。

$Files = Get-ChildItem -Path E:\Script\test |
Where-Object {$_.CreationTime -gt (Get-Date).AddDays(-1)}

$Files | Select-Object -Property Name, hash, LastWriteTime, @{N='SizeInKb';E={[double]('{0:N2}' -f ($_.Length/1kb))}}
Run Code Online (Sandbox Code Playgroud)

Has*_*own 10

我不喜欢这里写的类似 DOS 的大脚本答案,但后来找到了一个惯用的教程

从要查找重复项的文件夹中,只需运行这组简单的管道

Get-ChildItem -Recurse -File | 
    Group-Object Length | 
    Where-Object { $_.Count -gt 1 } | 
    select -ExpandProperty group | 
    foreach {Get-FileHash -LiteralPath $_.FullName} | 
    group -Property hash | 
    where { $_.count -gt 1 } | 
    select -ExpandProperty group
Run Code Online (Sandbox Code Playgroud)

这将显示与其他文件匹配的所有文件及其哈希值。
每行执行以下操作:

  • 获取文件
    • 从当前目录(-Path $directory否则使用)
    • 递归(如果不需要,删除-Recurse
  • 根据文件大小分组
  • 丢弃少于 2 个文件的组
  • 获取所有这些文件
  • 获取每个哈希值
  • 基于哈希的分组
  • 丢弃少于 2 个文件的组
  • 获取所有这些文件

添加 | %{ $_.path }仅显示路径而不是散列。
添加 | %{ $_.path -replace "$([regex]::escape($(pwd)))",'' }以仅显示当前目录的相对路径(在递归中很有用)。

特别是对于提问者,不要忘记在| Where-Object {$_.CreationTime -gt (Get-Date).AddDays(-1)}之后重击,gci这样你就不会比较你不想考虑的文件,如果你有很多巧合的相同长度的文件,这可能会非常耗时那个共享文件夹。

最后,如果你像我一样,只是想根据名字找到欺骗者,因为谷歌可能也会带你到这里:

gci -Recurse -file | Group-Object name | Where-Object { $_.Count -gt 1 } | select -ExpandProperty group | %{ $_.fullname }


pos*_*ote -1

由于您确定文件内容重复。更谨慎的做法是仅对文件进行哈希处理并比较哈希值。

名字,尺寸。对于定义的用例来说,时间戳不是一个谨慎的属性。因为哈希会告诉您文件是否具有相同的内容。

查看这些讨论

需要一种方法来检查两个文件是否相同?计算文件的哈希值。这是一种方法: https: //blogs.msdn.microsoft.com/powershell/2006/04/25/duplicate-files

重复文件查找器和删除器

现在,您一直在等待的时刻......全 PowerShell 文件重复查找器和删除器!现在您可以清理所有图片、音乐文件和视频的副本。该脚本打开一个文件对话框来选择目标文件夹,递归扫描每个文件是否有重复项

https://gallery.technet.microsoft.com/scriptcenter/Duplicate-File-Finder-and-78f40ae9