复制文件夹结构和特定文件夹的内容
Copy folder structure and content of specific folders
所以我发现 xcopy 对复制整个文件夹结构非常有帮助。但我还需要将特定文件夹的内容也复制到新目录中。
例如:
1. C:\OriginalDir
- \This
* \Test
- \That
* \Test
- \Other
我可以使用:xcopy C:\OriginalDir C:\TempDir /e /t
复制C:\OriginalDir
的整个结构。但是,我还需要将两个 \Test
文件夹的内容也复制到新目录中。我是 xcopy 的新手,我也研究过 robocopy。有没有办法做到这一点?我试图在 powershell 中完成此操作并考虑遍历文件夹结构,但是当我最终到达测试文件夹时仍然没有存储父文件夹结构。
谢谢。
您是否尝试过 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 开关
感谢史蒂夫让我开始并让我正确地思考这个问题。最终没有使用 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
}
}
}
}
所以我发现 xcopy 对复制整个文件夹结构非常有帮助。但我还需要将特定文件夹的内容也复制到新目录中。
例如:
1. C:\OriginalDir
- \This
* \Test
- \That
* \Test
- \Other
我可以使用:xcopy C:\OriginalDir C:\TempDir /e /t
复制C:\OriginalDir
的整个结构。但是,我还需要将两个 \Test
文件夹的内容也复制到新目录中。我是 xcopy 的新手,我也研究过 robocopy。有没有办法做到这一点?我试图在 powershell 中完成此操作并考虑遍历文件夹结构,但是当我最终到达测试文件夹时仍然没有存储父文件夹结构。
谢谢。
您是否尝试过 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 开关
感谢史蒂夫让我开始并让我正确地思考这个问题。最终没有使用 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
}
}
}
}