我试图为一个简单的备份系统镜像几个文件夹。
假设我有以下文件结构:
c:\temp\a.txt
c:\temp\b.txt
c:\temp\sub\a.txt
c:\temp\sub\112233.txt
c:\temp\sub2\pictureofaduck.jpg
我的目标是将c:\ temp \的全部内容复制到新目的地(D:\ mybackup),如下所示:
d:\mybackup\a.txt
d:\mybackup\b.txt
d:\mybackup\sub\a.txt
d:\mybackup\sub\112233.txt
d:\mybackup\sub2\pictureofaduck.jpg
我错误地认为这对使用此行的Copy-Item来说应该是一项简单的任务:
Copy-Item 'C:\temp\' -Destination 'D:\mybackup\' -Recurse
与我的期望相反,Copy-Item真的很想保持这个" temp"游戏中的文件夹。因为无论什么通配符和-at结束组合我尝试,我得到以下结果或只有两个文件a.txt& b.txt已复制。
d:\mybackup\temp\a.txt
d:\mybackup\temp\b.txt
d:\mybackup\temp\sub\123.txt
d:\mybackup\temp\sub\112233.txt
d:\mybackup\temp\sub2\pictureofaduck.jpg
请帮助我,这太荒谬了。 附:这个问题的解决方案在这里不起作用 - 去过那里。我只得到根文件: Copy entire folder structure in Powershell without re-creating root folder
答案 0 :(得分:3)
我真的更喜欢Xcopy
或RoboCopy
来完成这些工作,但是如果你真的想要使用Copy-Item:
Get-ChildItem C:\temp -Recurse | % {Copy-Item $_.FullName D:\mybackup}
使用Xcopy:
xcopy C:\temp D:\mybackup /e
使用RoboCopy:
robocopy C:\temp D:\mybackup /e
答案 1 :(得分:1)
感谢@Avshalom的投入,我找到了答案。 我自己编写了一个用于将来使用的函数:
function myCopyFolder([string] $sourceFolder, [string] $destFolder) {
$i = 0
Get-ChildItem $sourceFolder -Recurse | % {
$destName = $_.FullName
$destName = $destName.Replace($sourceFolder, '')
Write-Host $_.FullName -Destination (Join-Path $destFolder $destName)
$i = $i + 1
}
write-host $i 'files' copied
}
现在我得到像xcopy这样的完整副本。我也尝试过实现过滤器,但是如果需要,我必须找到一种方法来单独复制文件夹。 - 它正是我想要的。
我按文件类型添加了过滤:(空文件夹不会被过滤器复制)
function myCopyFolder([string] $sourceFolder, [string] $destFolder, [string] $filter) {
$i = 0
Get-ChildItem $sourceFolder -Recurse -Filter $filter | % {
$destName = $_.FullName
$destName = $destName.Replace($sourceFolder, '')
$subFolder = $destName.Replace($_.Name, '').Replace('\','')
if ($subFolder -ne '') {
if (-not (Test-Path (Join-Path $destFolder $subFolder))) {
mkdir (Join-Path $destFolder $subFolder)
}
}
Copy-Item $_.FullName -Destination (Join-Path $destFolder $destName)
$i = $i + 1
}
write-host $i 'files' copied
}
答案 2 :(得分:1)
另一种解决方法可能是使用Copy-Item
后跟Move-Item
Copy-Item 'C:\temp\' -Destination 'D:\' -Recurse
Move-Item 'D:\temp\' -Destination 'D:\mybackup'
这确实有警告
D:\temp
尚不存在。如果是这样,你最终会覆盖/移动其他文件D:\mybackup
尚不存在