我有一个目录 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