将文件从多个(指定)文件夹路径复制到另一个目录,同时保持文件结构

时间:2017-03-22 12:13:23

标签: powershell directory data-migration file-copying

我正在尝试使用PowerShell将多个文件从一个目录复制到另一个目录。 我想:

  • 维护文件夹/文件结构。
  • 复制特定文件夹中的所有文件。

假设结构:

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}
    }

正如您所看到的,匹配只会根据当前代码返回一个文件路径,我想要做的是扩展它以匹配多个文件夹名称。

我尝试过:

  • 在单独的PowerShell文件中使用不同的FolderName运行此代码但没有成功。
  • 使用文件夹名称数组进行匹配。
  • 使用-and / -or运算符扩展匹配函数。

2 个答案:

答案 0 :(得分:1)

感谢所有对这个问题的回复,你们都帮助我指出了正确的方向。这是我采用的解决方案:

#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同步时遇到了问题,如果文件放在根文件夹中,它将被复制。我必须创建一个单独的文件列表,以便从根目录中排除。

答案 1 :(得分:0)

虽然robocopy可能仍然是最好的方法,但是 此脚本首先标识要复制的文件夹(使用或| 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
    }