使用Powershell复制文件子集以保持文件夹结构

问题描述 投票:1回答:1

寻找一些有关复制挑战的Powershell帮助。

我需要将所有MS Office文件从一个相当大的NAS(其中超过400万个,略超过5TB)复制到另一个驱动器,并保留用于复制文件的现有文件夹结构。

我有一个所有常见Office文件类型的文本文件(大约有40种)-extns.txt

[在这个阶段,作为一个优秀的StackExchanger,我会发布到目前为止的脚本,但是我花了一天的大部分时间在此上,而且,不仅我感到尴尬,甚至怀疑基本算法也是错误的。

我开始对旧NAS上的整个树进行gci,每种文件类型一次然后,我认为最好遍历一次并将每个文件与有效类型列表进行比较。然后,我完全陷入了重建文件夹结构的困境。我首先分割'\'并遍历路径,然后浪费了一个小时的搜索时间,因为我以为我记得曾读过一篇关于复制路径(如果不存在的话)的简单方法的信息。

[另一种选择是,我将要复制的所有文件(具有完整路径)转出一个400万行的文本文件(这很容易,因为我将整个结构导入SQL Server以分析其中的内容)并使用该文件作为来源列表

我不希望有“请为我编写编码解码器”的答案,但是希望能找到一些关于最佳方法的指针/想法。

powershell
1个回答
0
投票

我不确定这是否是最好的方法,但是下面的脚本至少是一个可行的解决方案。

$sourceRootPath = "D:\Source"
$DestFolderPath = "E:\Dest"

$extensions = Get-Content "D:\extns.txt"

# Prefix "*." to items in $extensions if it doesn't already have it
$extensions = $extensions -replace "^\*.|^","*."

$copiedItemsList = New-Object System.Collections.ArrayList

foreach ( $ext in $extensions ) {
    $copiedItems = Copy-Item -Path $sourceRootPath -Filter $ext -Destination $DestFolderPath -Container -Recurse -PassThru
    $copiedItems | % { $copiedItemsList.Add($_) | Out-Null }
}

$copiedItemsList = $copiedItemsList | select -Unique

# Remove Empty 'Deletable' folders that get created while maintaining the folder structure with Copy-Item cmdlet
While ( $DeletableFolders = $copiedItemsList | ? { ((Test-Path $_) -and $_.PSIsContainer -eq $true -and ((gci $_ | select -first 1).Count -eq 0)) } ) {
    $DeletableFolders | Remove-Item -Confirm:$false
}

Copy-Item-Container开关将为我们保留文件夹结构。但是,用这种方法我们可能会遇到空文件夹。

因此,我正在使用名为arraylist$copiedItemsList将复制的对象添加到其中,稍后我将使用它确定空的“可删除”文件夹,然后在脚本末尾将其删除。

希望这会有所帮助!

© www.soinside.com 2019 - 2024. All rights reserved.