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

Time:04-07

I want to get the duplicates from a folder structure and copy all of them to a single folder, while renaming (so they don't overwrite). I would like the first file from a duplicates group to be copied with it's original name, and for the rest to add "_X" at the end of the name.

I wrote a code that almost works, but at some point it just overwrites the first file copied. Only one file is being overwritten, the rest are renamed and copied like intended.

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
    }

CodePudding user response:

I don't see the actual problem but you could rewrite the code without using Test-Path. Remove Select-Object -ExpandProperty Group too, then iterate over each group's elements. Increment a counter and append it to all file names except the first one.

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  
        }
    }
  • Related