2013-11-01 46 views
1

我需要掃描CIFShare並獲取共享中所有文件和文件夾的文件屬性和ACL屬性。我知道在get-chilItem中有一個-recursive選項,但在如果使用-recursive選項,那麼非常大的份額非常耗時。我知道這可以通過多線程來實現。get-childItem的PowerShell多線程

假設層次結構是這樣的: -

Root 
Root\FolderA 
Root\FolderA\FolderA1\FolderA2\FolderA3\FolderA3\FolderA4 
Root\FolderB\.. 
.. 

我已經得到了腳本獲取根的所有文件的文件屬性和ACL和文件夾,並開始工作的每個文件夾在沒有任何錯誤的情況下運行的根目錄(文件夾A,文件夾B等)。我試圖爲每個文件夾(目錄結構中的所有級別)創建作業,並且這反過來導致作業被掛起或者PowerShell被關閉。 我正在使用PowerShell V2.0,並且在我們的環境中不能在該版本中進行任何升級。如果這是一個非常愚蠢的問題,我對PowerShell很陌生,請原諒。

在此先感謝您的幫助。

+0

添加更多的線程是不可能給你的性能提升,並能很可能使它更慢。這裏的限制因素很可能是磁盤驅動器的速度,如果您添加多個線程向其發出請求,那麼您只需添加額外磁盤搜索的開銷。 –

回答

0

我試圖爲每個文件夾(目錄結構中的所有級別)創建作業,這反過來導致作業掛起或PowerShell獲得強制關閉。

這是因爲您不限制創造就業機會。您可能會創建數百個(如果不是數千個)並行作業,這會耗盡任何服務器上的內存。啓動多個並行作業或線程非常好,並且可以通過提高總體執行時間 - 直到創建太多系統無法處理負載。

請參閱this SO answer瞭解將作業數量限制在合理數量的方法。爲了避免資源爭用,我建議保持工作數在10以下,但非常大的服務器上存儲速度非常快。

0

我不會爲此使用PowerShell作業。獲取文件和ACL信息是一項相對簡單的任務,並且有可用的內置可執行文件。初始化Powershell工作會話是對資源的相當大的投資,對於簡單的任務並不是真正的資源投資。

而不是作業,我會使用傳統的dir和cacls \ icacls來獲取文件和ACL信息,並將輸出傳送到文件以便稍後進行收集和聚合。使用powershell腳本來創建和啓動cmd進程,監視已創建進程的進度以阻止線程創建。然後返回另一個腳本來收集和彙總文件中的信息。

恕我直言

1

您是否在機器上安裝了PowerShell 3?如果你這樣做,那麼你可以創建一個採用文件夾數組列表的工作流程。我沒有這樣做的片段,但如果您有興趣,我可以提出一些建議。

編輯(下文將僞代碼):

workflow GetFileInformation 
{ 
    param([System.IO.FileSystemInfo[]] $folders) 

    foreach -parallel ($folder in $folders) 
    { 
     inlinescript 
     { 
      $files = GCI -LiteralPath $folder.FullName -File 
      # Here you will have an Array of System.IO.FileSystemInfo 
      # I do not know what you want to do from here, 
      # but the caller will have no visibility of this object 
      # since it is on a separate thread. 
      # but you can write the results to a file or database. 
      # Hope this helps some. 
     } 
    } 
} 

$dir = GCI C:\ -Directory -Recurse 
GetFileInformation $dir 
+0

感謝websch01ar。 但是現在不可能將環境更改爲PowerShell v3。 – minuvnath