[英]How to speed up Get-ChildItem in Powershell
只是徘徊我怎樣才能加快 Powershell 中的 Get-ChildItem ?
我有以下腳本來搜索今天創建的文件並將其復制到另一個文件夾。
$fromDirectory = "test_file_*.txt"
$fromDirectory = "c:\sour\"
$toDirectory = "c:\test\"
Get-ChildItem $fromDirectory -Include $fileName -Recurse | Where {$_.LastWriteTime -gt (Get-Date).Date} | Copy-Item -Destination $toDirectory
由於我搜索的文件夾有 124,553 個歷史文件,因此搜索需要我的時間。 有誰知道如何改進我的腳本以加快搜索和復制速度?
以下是一些可以嘗試的事情:
首先,使用 Measure-Command {} 獲取實際性能:
Measure-Command { Get-ChildItem $fromDirectory -Include $fileName -Recurse | Where {$_.LastWriteTime -gt (Get-Date).Date} | Copy-Item -Destination $toDirectory }
然后,考慮刪除“-Recurse”標志,因為這實際上是進入每個目錄以及子目錄和子目錄的子目錄。 如果您的目標日志文件真的那么分散,那么......
嘗試使用 robocopy 匹配文件名和 lastwritetime 中的模式,然后使用 powershell 進行復制。 您甚至可以使用 robocopy 進行復制。
您可能只是要解決一個巨大而緩慢的問題,但請嘗試這些,看看您是否可以將其分解。
這是 NTFS 的一個眾所周知的特性。 微軟的文檔說,降低性能的限制是一個目錄中大約 50 000 個文件。
如果文件名非常相似,當有大約 300 000 個文件時,8dot3 舊名稱的創建將開始減慢。 盡管您“只有” 120 k 個文件,但數量級相同。
一些先前的問題討論了這個問題。 可悲的是,沒有一個好的解決方案,但目錄中的層次結構更好。 通常的技巧是使用fsutil
和通過注冊表的最后訪問日期禁用 8dot3,但這些只會有很大幫助。
你能重新設計目錄結構嗎? 將舊文件移動到年季度子目錄可能會保持主目錄足夠干凈。 要找出文件的年季度,一種快速的方法是這樣的,
gci | % {
$("{2} => {1}\Q{0:00}" -f [Math]::ceiling( ($_.LastAccessTime.toString('MM'))/3),
$_.LastAccessTime.ToString('yyyy'),
$_.Name
)
}
我會嘗試把Get-ChildItem $fromDirectory -Include $fileName -Recurse | Where {$_.LastWriteTime -gt (Get-Date).Date}
Get-ChildItem $fromDirectory -Include $fileName -Recurse | Where {$_.LastWriteTime -gt (Get-Date).Date}
在數組中,然后從數組中復制結果。
$GrabFiles =@()
$GrabFiles =@( Get-ChildItem $fromDirectory -Include $fileName -Recurse | Where {$_.LastWriteTime -gt (Get-Date).Date} )
Copy-Item -Path $GrabFiles -Destination $toDirectory }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.