我撰寫了一個腳本來幫助我識別大型電影收藏中的重復檔案。出于某種原因,如果我將這些命令拆分并匯出/匯入到 CSV,它的運行速度要比將所有內容都留在記憶體中要快得多。這是我的原始代碼,速度太慢了:
Get-ChildItem M:\Movies\ -recurse | where-object {$_.length -gt 524288000} | select-object Directory, Name | Group-Object directory | ?{$_.count -gt 1} | %{$_.Group} | export-csv -notypeinformation M:\Misc\Scripts\Duplicatemovies.csv
如果我把它分成 2 個命令并在中間匯出到 CSV,它的運行速度大約快 100 倍。我希望有人可以闡明我做錯了什么。
Get-ChildItem M:\Movies\ -recurse | where-object {$_.length -gt 524288000} | select-object Directory, Name | Export-Csv -notypeinformation M:\Misc\Scripts\DuplicateMovies\4.csv
import-csv M:\Misc\Scripts\DuplicateMovies\4.csv | Group-Object directory | ?{$_.count -gt 1} | %{$_.Group} | export-csv -notypeinformation M:\Misc\Scripts\DuplicateMovies\Duplicatemovies.csv
remove-item M:\Misc\Scripts\DuplicateMovies\4.csv
感謝任何建議,
~TJ
uj5u.com熱心網友回復:
這不是Group-Object慢,而是您的分組條件,您要求它按代表其父檔案夾實體的屬性FileInfo對物件進行分組。因此,您要求 cmdlet 按一個非常復雜的物件對物件進行分組作為分組條件,而不是您可以使用該屬性作為分組條件,它表示父目錄的屬性(一個簡單的字串),或者您可以使用該屬性表示父檔案夾(也是一個簡單的字串)。.DirectoryDirectoryInfo.DirectoryNameFullName.Directory.NameName
總而言之,在這種情況下匯出到 CSV 速度更快的主要原因是,當Export-Csv從管道接收物件時,它會呼叫ToString()每個物件的屬性值的方法,因此Directory實體會轉換為其字串表示形式(呼叫ToString()此實體最終成為檔案夾的FullName)。
至于您的代碼,如果您想保持盡可能高效而又不使其過于復雜:
Get-ChildItem M:\Movies\ -Recurse -File | & {
process {
if($_.Length -gt 500mb) { $_ }
}
} | Group-Object DirectoryName | & {
process {
if($_.Count -gt 2) {
foreach($object in $_.Group) {
[pscustomobject]@{
Directory = $_.Name # => This is the Parent Directory FullName
Name = $object.Name
}
}
}
}
} | Export-Csv M:\Misc\Scripts\DuplicateMovies\4.csv -NoTypeInformation
如果您想按 ParentName而不是 對它們進行分組FullName,您可以使用:
Group-Object { $_.Directory.Name }
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/518214.html
標籤:电源外壳组对象
