Test-Path cmdlet 仅对 20 个文件中的一个文件失败

Test-Path cmdlet fails only for one file out of 20

我想从文件夹结构中获取重复项并将它们全部复制到一个文件夹中,同时重命名(这样它们就不会被覆盖)。我希望重复组中的第一个文件用它的原始名称复制,其余的在名称末尾添加“_X”。

我写了一个几乎可以工作的代码,但在某些时候它只是覆盖了复制的第一个文件。只有一个文件被覆盖,其余文件按预期重命名和复制。

Get-ChildItem $SourcePath -Recurse -File -Force | Group-Object -Property Name | Where-Object {$_.Count -gt 1} | Select-Object -ExpandProperty Group | 
    ForEach-Object {        
        $SourceFile = $_.FullName
        $FileName = $($_.BaseName + $_.Extension)
        $DestFileName = Join-Path -Path $DestinationPath -ChildPath $FileName
            if (Test-Path -Path $DestFileName) {
                $DestinationFile = "$DestinationPath\" + $_.BaseName + "_" + $i + $_.Extension
                $i+=1                                                                                       
            } else {
                $DestinationFile = $DestFileName 
            }
            Copy-Item -Path $SourceFile -Destination $DestinationFile
    }

我没有看到实际问题,但您可以在不使用 Test-Path 的情况下重写代码。也删除 Select-Object -ExpandProperty Group,然后遍历每个组的元素。增加一个计数器并将其附加到除第一个文件之外的所有文件名。

Get-ChildItem $SourcePath -Recurse -File -Force | Group-Object -Property Name | Where-Object Count -gt 1 | 
    ForEach-Object {        

        $i = 0

        foreach( $dupe in $_.Group ) {

            $SourceFile = $dupe.FullName
            $DestinationFile = Join-Path -Path $DestinationPath -ChildPath $dupe.BaseName

            if( $i -gt 0 ) { $DestinationFile += "_$i" }

            $DestinationFile += $dupe.Extension

            Copy-Item -Path $SourceFile -Destination $DestinationFile

            $i++
        }
    }