复制文件夹结构和特定文件夹的内容

时间:2016-04-26 14:45:51

标签: powershell xcopy

所以我发现xcopy对于复制整个文件夹结构非常有帮助。但我还需要将特定文件夹的内容复制到新目录中。

例如:

1. C:\OriginalDir
- \This
     * \Test
- \That
     * \Test
- \Other

我可以使用xcopy C:\OriginalDir C:\TempDir /e /t来复制C:\OriginalDir的整个结构。但是,我还需要将两个\Test文件夹的内容复制到新目录中。我对xcopy很新,我也研究过robocopy。有没有办法做到这一点?我试图在PowerShell中完成此任务,并考虑迭代文件夹结构,但是当我最终到达Test文件夹时,它仍然没有存储父文件夹结构。

感谢。

2 个答案:

答案 0 :(得分:2)

您是否尝试过robocopy - 例如:

$source = "C:\Your\Source\Directory"
$dest = "C:\Your\Destination\Directory"
robocopy $source $dest /e

'e'开关将复制子目录及其内容(包括空子目录)。

如果您想要排除\ Other目录(问题并不完全清楚),您可以执行以下操作:

  robocopy $source $dest /e /xf *

(这只是复制目录结构而没有复制文件)

robocopy $source $dest /XD C:\Other /e

(这会复制文件,但不包括指定的目录)

您可以在此处找到更多信息:

https://technet.microsoft.com/en-GB/library/cc733145.aspx

编辑:

为了只复制以'Test'开头的目录,您可以执行以下操作:

  $exclude = gci C:\OriginalDir -ad | ?{ $_.Name -notlike 'Test*'
  robocopy $source $dest /XD $exclude /e

如果你的文件夹结构有多个级别,你可以在Get-Childitem上使用-recurse开关

答案 1 :(得分:1)

感谢史蒂夫让我开始让我正确地思考这个问题。在没有使用RoboCopy或Xcopy的情况下手动编写脚本,因为我无法让它们按照我想要的方式工作。

$target = "C:\\TestTemp"
foreach($item in (Get-ChildItem "C:\\OriginalDir\\This" -Recurse)){

    if ($item.PSIsContainer -and ($item.Name -eq "obj" -or $item.Name -eq "bin")){
        $tempPath = $target
        $path = $item.FullName
        $trimmed = $path.TrimStart("C:\\OriginalDir")
        $pieces = $trimmed.Split("\\");

        foreach($piece in $pieces){

            $tempPath = "$tempPath\$piece"
            New-Item -ItemType Directory -Force -Path "$tempPath"
            if($piece -eq "Test" -or $piece -eq "Temp"){
            Copy-Item -path $path\** -Destination $tempPath -Recurse -force
            }
        }
    }
}