使用 Powershell,如何 return 根据是否存在具有不同命名约定的重复文件的文件列表?

Using Powershell, how to return a list of files based on the existence of duplicate files with a different naming convention?

项目文件夹中有多个.webp 文件。有些 .webps 是原始图片,有些用作缩略图(它们的大小不同)。使用的命名约定是:原始文件名为 NAME.webp,缩略图为 NAME-thumb.webp.

我正在尝试根据相应的 thumb-webp 是否存在来 return 所有 .webp 文件。因此,如果图片 SAMPLE.webp 有一个 SAMPLE-thumb.webp,请不要将此文件添加到列表中。但是如果 SAMPLE.webp 没有相应的 SAMPLE-thumb.webp,那么在列表中执行它。

这是我到目前为止尝试过的方法:

$example = Get-ChildItem -File $dir\*.webp |
        Group-Object { $_.BaseName } |
          Where-Object { $_.Name -NotContains "-thumb" } |
            ForEach-Object Group

您可以执行以下操作:

(Get-ChildItem $dir\*.webp -File |
    Group-Object {$_.BaseName -replace '-thumb$'} |
        Where Count -eq 1).Group

你一定对分组有共同点。替换 BaseName 属性 中的结尾 -thumb 即可创建。如果没有 filenamefilename-thumb,则结果 GroupInfo 的计数值为 1

使用语法 ().Group returns 所有文件对象。如果你想针对每个文件处理代码,你可以使用 Foreach-Object 代替:

Get-ChildItem $dir\*.webp -File |
    Group-Object {$_.BaseName -replace '-thumb$'} |
        Where Count -eq 1 | Foreach-Object {
            $_.Group
        }

无需使用 Where-Object 和测试路径进行分组即可获得此结果。

Get-ChildItem -File $dir\*.webp |
    Where-Object {$_.Name -notmatch "-thumb" -and -not(Test-Path ($_.FullName -replace ".webp","-thumb.webp"))}

这应该会为您列出所有没有相应缩略图文件的文件。