将文件从多个(指定的)文件夹路径复制到另一个目录,同时保持文件结构
Copying files from multiple (specified) folder paths to another directory while maintaining file structure
我正在尝试使用 PowerShell 将多个文件从一个目录复制到另一个目录。
我愿意:
- 保持folder/file结构。
- 复制特定文件夹中的所有文件。
假设结构:
Source Folder
\User 1
\Folder 1
\Files
\Folder 2
\Files
\Folder 3
\Files
\User 2
\Folder 3
\Files
\User 3
\Folder 2
\Files
\User 4
\Folder 3
\Files
\Folder 4
\Files
可能的情况:
- 我想复制用户拥有文件夹 1 和文件夹 2 的文件。
预期结果:
Destination Folder
\User 1
\Folder 1
\Files
\Folder 2
\Files
\User 3
\Folder 2
\Files
这是我目前的代码:
$FolderName = '\Folder 1\'
$source = 'C:\CDPTest\Live'
$target = 'C:\CDPTest\DevTest'
$source_regex = [regex]::Escape($source)
(gci $source -Recurse | where {-not ($_.PSIsContainer)} | select -Expand FullName) -match $FolderName |
foreach {
$file_dest = ($_ | Split-Path -Parent) -replace $source_regex, $target
if (-not (Test-Path $file_dest)) {mkdir $file_dest}
}
如您所见,根据当前代码,匹配只会return一个文件路径,我想做的是扩展它以匹配多个文件夹名称。
我尝试过的:
- 运行 此代码在单独的 PowerShell 文件中使用不同的 FolderName,但没有成功。
- 使用文件夹名称数组进行匹配。
- 使用
-and
/-or
运算符扩展匹配功能。
虽然 robocopy 可能仍然是最好的方法,
此脚本首先识别要复制的文件夹(使用 or |
RegEx),然后构建目标文件夹并在必要时创建它。 (未经测试)
$FolderName = [regex]('\Folder 1$|\Folder 2$')
$source = 'C:\CDPTest\Live'
$target = 'C:\CDPTest\DevTest'
Get-ChildItem $source -Recurse |
Where-Object {$_.PSIsContainer -and $_.FullName -match $FolderName} |
Foreach-Object {
$targetFolder = Join-Path $target ($_.FullName -replace [RegEx]::escape($source),'')
if (!(Test-Path $targetFolder)) {mkdir $targetFolder|Out-Null}
Copy-Item -Path $_ -Filter * -Destination $targetFolder
}
感谢所有对这个问题的回复,你们都帮助我指明了正确的方向。这是我使用的解决方案:
#Used for time-stamped logs (requires C:\Root\RobocopyLogs\ to exist)
#$log can be added after '$dest$'
#$dateTime = Get-Date -Format g
#$currentDateTime = get-date -format "MM.dd.yyyy-HH.mm.ss.fff"
#$log = "/log:C:\Root\RobocopyLogs$currentDateTime.txt"
# Set up variables
$sourceRootDirectory = "C:\Root\Source"
$userDirectories = $sourceRootDirectory+"\*\"
$dest = "C:\Root\Destination"
$excludeExceptions = @("Folder 1",
"Folder 2",
"Folder 3",
"Folder 4",
"Folder 5")
# Get the exclusion list from the source
$excludedFolderArray = (gci $userDirectories -Exclude $excludeExceptions)
$excludedFileArray = $excludedFolderArray |
Where-Object {$_.PSIsContainer -eq $False}
Robocopy $sourceRootDirectory $dest /FFT /MIR /XA:H /R:1 /W:5 /XD $excludedFolderArray /XF $excludedFileArray
我在与 robocopy 同步时遇到问题,如果文件放在根文件夹中,它会被复制过来。我必须创建一个单独的文件列表以从根目录中排除。
我正在尝试使用 PowerShell 将多个文件从一个目录复制到另一个目录。 我愿意:
- 保持folder/file结构。
- 复制特定文件夹中的所有文件。
假设结构:
Source Folder \User 1 \Folder 1 \Files \Folder 2 \Files \Folder 3 \Files \User 2 \Folder 3 \Files \User 3 \Folder 2 \Files \User 4 \Folder 3 \Files \Folder 4 \Files
可能的情况:
- 我想复制用户拥有文件夹 1 和文件夹 2 的文件。
预期结果:
Destination Folder \User 1 \Folder 1 \Files \Folder 2 \Files \User 3 \Folder 2 \Files
这是我目前的代码:
$FolderName = '\Folder 1\'
$source = 'C:\CDPTest\Live'
$target = 'C:\CDPTest\DevTest'
$source_regex = [regex]::Escape($source)
(gci $source -Recurse | where {-not ($_.PSIsContainer)} | select -Expand FullName) -match $FolderName |
foreach {
$file_dest = ($_ | Split-Path -Parent) -replace $source_regex, $target
if (-not (Test-Path $file_dest)) {mkdir $file_dest}
}
如您所见,根据当前代码,匹配只会return一个文件路径,我想做的是扩展它以匹配多个文件夹名称。
我尝试过的:
- 运行 此代码在单独的 PowerShell 文件中使用不同的 FolderName,但没有成功。
- 使用文件夹名称数组进行匹配。
- 使用
-and
/-or
运算符扩展匹配功能。
虽然 robocopy 可能仍然是最好的方法,
此脚本首先识别要复制的文件夹(使用 or |
RegEx),然后构建目标文件夹并在必要时创建它。 (未经测试)
$FolderName = [regex]('\Folder 1$|\Folder 2$')
$source = 'C:\CDPTest\Live'
$target = 'C:\CDPTest\DevTest'
Get-ChildItem $source -Recurse |
Where-Object {$_.PSIsContainer -and $_.FullName -match $FolderName} |
Foreach-Object {
$targetFolder = Join-Path $target ($_.FullName -replace [RegEx]::escape($source),'')
if (!(Test-Path $targetFolder)) {mkdir $targetFolder|Out-Null}
Copy-Item -Path $_ -Filter * -Destination $targetFolder
}
感谢所有对这个问题的回复,你们都帮助我指明了正确的方向。这是我使用的解决方案:
#Used for time-stamped logs (requires C:\Root\RobocopyLogs\ to exist)
#$log can be added after '$dest$'
#$dateTime = Get-Date -Format g
#$currentDateTime = get-date -format "MM.dd.yyyy-HH.mm.ss.fff"
#$log = "/log:C:\Root\RobocopyLogs$currentDateTime.txt"
# Set up variables
$sourceRootDirectory = "C:\Root\Source"
$userDirectories = $sourceRootDirectory+"\*\"
$dest = "C:\Root\Destination"
$excludeExceptions = @("Folder 1",
"Folder 2",
"Folder 3",
"Folder 4",
"Folder 5")
# Get the exclusion list from the source
$excludedFolderArray = (gci $userDirectories -Exclude $excludeExceptions)
$excludedFileArray = $excludedFolderArray |
Where-Object {$_.PSIsContainer -eq $False}
Robocopy $sourceRootDirectory $dest /FFT /MIR /XA:H /R:1 /W:5 /XD $excludedFolderArray /XF $excludedFileArray
我在与 robocopy 同步时遇到问题,如果文件放在根文件夹中,它会被复制过来。我必须创建一个单独的文件列表以从根目录中排除。