簡體   English   中英

如何加快 Powershell 中的 Get-ChildItem

[英]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.

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