如何使用 Powershell 复制目录并覆盖其内容(如果存在)?

如何使用 Powershell 复制目录并覆盖其内容(如果存在)?

我有一个目录 Source,里面有一些文件,我想将其复制到文件夹 Destination。Destination 可能存在,并且其中可能已经有文件。任何与 Source 中同名的文件都应被覆盖。

如果我在 Powershell 中运行它:

Copy-Item Source Destination -Force -Recurse
Copy-Item Source Destination -Force -Recurse
Copy-Item Source Destination -Force -Recurse

然后第一行创建文件夹.\Destination并复制.\Source到其中,这是我下次想重复的操作。但是,第二行复制.\Source到新.\Destination文件夹(创建.\Destination\Source),然后第三行.\Destination\Source再次覆盖。

我怎样才能让它始终像第一种情况一样运行?也就是说,覆盖.\Destination而不是复制到其中?

答案1

所以问题是这样的:

Copy-Item -Force -Recurse foo bar

仅当bar不存在时才有效,并且:

Copy-Item -Force -Recurse foo/* bar

仅当存在时才有效。因此,要解决这个问题,您需要 在执行任何操作之前bar确保存在:bar

New-Item -Force -Type Directory bar
Copy-Item -Force -Recurse foo/* bar

答案2

Steven Penny 的回答https://superuser.com/a/742719/126444不会删除目标目录的原始内容,只会向其附加内容。我需要用源内容完全替换目标文件夹,并创建了 2 个函数:

function CopyToEmptyFolder($source, $target )
{
    DeleteIfExistsAndCreateEmptyFolder($target )
    Copy-Item $source\* $target -recurse -force
}
function DeleteIfExistsAndCreateEmptyFolder($dir )
{
    if ( Test-Path $dir ) {
    #http://stackoverflow.com/questions/7909167/how-to-quietly-remove-a-directory-with-content-in-powershell/9012108#9012108
           Get-ChildItem -Path  $dir -Force -Recurse | Remove-Item -force -recurse
           Remove-Item $dir -Force

    }
    New-Item -ItemType Directory -Force -Path $dir
}

答案3

如果你只想复制“源”文件夹的内容,请使用

copy-item .\source\* .\destination -force -recurse

答案4

假设您有以下目录结构

    • 文件夹
      • 文本文件
      • 文本文件
      • 文本文件
    • 文件夹_b
      • 文本文件
      • 文本文件

    在根文件夹中您可以通过以下命令序列获得您想要的结果:

    $files = gci ./folder_b -name
    cp ./folder_a/*.txt -Exclude $files ./folder_b

仅复制 c.txt

相关内容