PowerShell:重复文件,排除文件夹,如果名称/大小相同,则删除

PowerShell:重复文件,排除文件夹,如果名称/大小相同,则删除,powershell,recursion,path,duplicates,Powershell,Recursion,Path,Duplicates,我对powershell非常陌生,我在谷歌上搜索了很多,并将结果合并到了这里,但首先,我的文件夹结构如下: 测试neu _贝维特 1.txt 2.txt 一, 1.txt 2.txt 二, 1.txt 3.txt 4.txt 我的目标是查找存储在\u bewertet中的所有文件,如果这些文件也存在于除自身以外的任何其他子文件夹中(关于文件名和大小),则应将其删除。因此,为了清楚起见,文件应该保存在\u bewertet中,而不是其他地方 $ignore = @("*_be

我对powershell非常陌生,我在谷歌上搜索了很多,并将结果合并到了这里,但首先,我的文件夹结构如下:

  • 测试neu
    • _贝维特
      • 1.txt
      • 2.txt
    • 一,
      • 1.txt
      • 2.txt
    • 二,
      • 1.txt
      • 3.txt
      • 4.txt
我的目标是查找存储在\u bewertet中的所有文件,如果这些文件也存在于除自身以外的任何其他子文件夹中(关于文件名和大小),则应将其删除。因此,为了清楚起见,文件应该保存在\u bewertet中,而不是其他地方

$ignore = @("*_bewertet*");
$one = Get-ChildItem -Recurse -path C:\Users\name\Desktop\test-neu\_bewertet
$two = Get-ChildItem -Recurse -path C:\Users\name\Desktop\test-neu -Exclude $ignore | ? { $_.PSIsContainer }

$matches = (Compare-Object -ReferenceObject $one -DifferenceObject $two -Property Name,Length -ExcludeDifferent -IncludeEqual)

foreach ($file in $matches)
{
    Remove-Item C:\Users\name\Desktop\test-neu\$($file.Name)
}
到目前为止,如果我运行我的脚本,它实际上什么都没有做…,我的猜测是,删除项目部分需要调整。例如,路径只指向C:\Users\name\Desktop\test neu\1.txt,因此缺少相应的子文件夹


如果你们能帮我,那对我来说意义重大。欢迎提出任何建议。祝你今天愉快。:)

为了实现这个目标,这是我能想到的最简单的逻辑

$keep = Dir -Path t:\bewertet -Recurse
$allFiles = Dir -Path t:\ -Recurse -Include *.txt | Where Directory -NotLike "t:\bewertet*"
$allFiles | Where Name -in $keep.Name | Remove-Item
$Keep
定义bewertet文件夹中的文件列表。
$allFiles
以递归方式定义所有文件的列表,仅指定.txt文件,其中目录不是t:\bewertet

最后,我们过滤
$allFiles
,在
$keep
中查找名称与文件匹配的文件,然后删除其中的每个文件

更好 OP回来说
我们忘了检查它的大小是否相同,所以我是在圣诞节的精神,我写了这个懒惰的比较

$keep = gci t:\bewertet -Recurse

$allFiles = dir -Path t:\ -Recurse -Include *.txt | Where Directory -NotLike "t:\bewertet*"

$matches = $allFiles | ? Name -in $keep.Name 

ForEach ($match in $matches){
    $source = $keep | ? Name -eq $match.Name
    $Samefile = ($source.Length -eq $match.length)
    "Does file size match? [$Samefile]"

        if ($Samefile){
            "deleting..."
            Remove-item $match
            }
}

您应该首先查看
Compare Object
的结果。如果为空,则不会发生循环。如果有结果,您应该在比较对象之后使用
Select-Expand InputObject
再次检索文件对象,这就像一个符咒。我知道可能有一个简短的解决办法。我刚刚在我的设置中测试了它,现在我需要更多的时间来完全理解它。谢谢你,先生:)很乐意帮忙。我的只是看起来有点复杂,因为我正在为
Dir
指定所有参数名,而不是使用位置参数等。没有考虑文件大小。该死,是的,我刚刚意识到缺少文件大小参数…如何考虑这一点?非常感谢,我感谢你的圣诞精神;)