簡體   English   中英

使用 Powershell 復制保留文件夾結構的文件子集

[英]Copy subset of files keeping folder structure using Powershell

尋找一些 Powershell 幫助解決復制挑戰。

我需要將所有 MS Office 文件從一個相當大的 NAS(超過 400 萬個,略超過 5tb)復制到另一個驅動器,保留復制文件的現有文件夾結構。

我有一個包含所有常見 Office 文件類型(大約 40 種)的文本文件 - extns.txt

在這個階段,作為一個優秀的 StackExchanger,我會發布到目前為止的腳本,但我已經花了一天中最好的時間在這上面,而且,不僅我得到的東西非常糟糕,我懷疑即使是基本算法也是錯誤的。

我開始對舊NAS上的整個樹進行gci,每種文件類型一次然后我認為最好遍歷一次並將每個文件與有效類型列表進行比較。 然后我對重建文件夾結構一團糟。 我首先在“\”上拆分並遍歷路徑,然后浪費了一個小時的搜索,因為我想我記得讀過有關復制路徑的簡單方法(如果它不存在)。

另一種選擇是我轉儲出我想要復制的所有文件(帶有完整路徑)的 400 萬行文本文件(這很容易,因為我將整個結構導入 SQL 服務器以分析那里的內容)並將其用作來源清單

我並不期待“請為我編寫 codez”的答案,但對於解決此問題的最佳方法的一些指示/想法將不勝感激。

我不確定這是否是最好的方法,但下面的腳本至少是一個可以接受的解決方案。

$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's Container switch
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開關將為我們保留文件夾結構。 但是,使用這種方法我們可能會遇到空文件夾。

因此,我使用名為$copiedItemsListarraylist將復制的對象添加到其中,稍后我將使用它來確定空的“可刪除”文件夾,然后在腳本末尾刪除這些文件夾。

希望這可以幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM