Copy-Item is overwriting by default

When in doubt, read the documentation.


Allows the cmdlet to copy items that cannot otherwise be changed, such as copying over a read-only file or alias.

The default behavior for Copy-Item is to replace existing items. The -Force switch is only to enforce replacement if for instance the destination file has the readonly attribute set.

You can use -Confirm to get prompted before Copy-Item performs the operation, or you can use -WhatIf to see what the cmdlet would do.

Old one, but I found a short expression that does that:

Copy-Item (Join-Path $dir_from "*") $dir_to -Exclude (Get-ChildItem $dir_to)

It copies all files from $dir_from to $dir_to but not (the -Exclude part) the files with names that are already in $dir_to

It seems to be the expected behaviour of Copy-Item to copy an item to the destination even if it already exists in destination. I suggest to test, if the destination file path exists and only copy the file if it does not yet exist.

$destinationPath = 'C:\tryout\destination';
if (!(Test-Path $destinationPath)) 
   New-Item -ItemType Directory -Force -Path $destinationPath;

$sourcePath = 'C:\tryout\source';
$originalfiles = Get-ChildItem -Path $sourcePath;

foreach ($file in $originalfiles) 
    Write-Host File Name: -ForegroundColor DarkYellow;
    Write-Host $file.Name;
    Write-Host File Path: -ForegroundColor DarkYellow;
    Write-Host $file.FullName;

    $src = $file.FullName;
    $dest = "C:\tryout\destination\$($file.Name)";

    if (!(Test-Path $dest))
        Copy-Item $src -Destination $dest;