没有源目录的{Copy-Item}

时间:2018-06-13 13:46:16

标签: powershell copy-item

我试图为一个简单的备份系统镜像几个文件夹。

假设我有以下文件结构:

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

3 个答案:

答案 0 :(得分:3)

我真的更喜欢XcopyRoboCopy来完成这些工作,但是如果你真的想要使用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尚不存在