2015-02-05 23 views
1

我試圖查看Robocopy的解決方案是否比使用Get-ChildItem獲取給定文件夾(和子文件夾...)內的文件列表的速度更快。獲取Robocopy的文件列表

在我的代碼我使用的Get-ChildItem cmdlet來獲取特定的文件夾內的所有文件的列表,以循環的每個文件:

$files = Get-ChildItem "C:\aaa" -Recurse | where {! $_.PIsContainer} # ! because I don't want to list folders 
foreach ($file in $files){ 
... 
} 

現在,我有ROBOCOPY命令獲取所有文件的列表,但是,robocopy的輸出是一個字符串。

[string]$result = robocopy "C:\aaa" NULL /l /s /ndl /xx /nc /ns /njh /njs /fp 

那麼,我該如何使用從Robocopy命令循環輸出上的每個文件(類似於與Get-ChildItem

+0

您使用的是什麼版本的PowerShell?如果它是3.0或以上,你可以刪除'where {! $ _。PSIsContainer}'只需執行'$ files = Get-ChildItem「C:\ aaa」-Recurse -File'來檢索文件,這可能會提高性能。 – BACON 2015-02-05 21:55:05

+0

@BACON,我正在使用2.0。 – 2015-02-06 19:06:01

回答

3

如果你只是尋找一種更快的方式來獲得文件的這份清單,遺留DIR命令將這樣做:

$files = cmd /c dir c:\aaa /b /s /a-d 
foreach ($file in $files){ 
... 
} 

編輯:一些性能對比測試 -

(measure-command {gci -r |? {-not $_.psiscontainer } }).TotalMilliseconds 
(measure-command {gci -r -file}).TotalMilliseconds 
(measure-command {(robocopy . NULL /l /s /ndl /xx /nc /ns /njh /njs /fp) }).TotalMilliseconds 
(measure-command {cmd /c dir /b /s /a-d }).TotalMilliseconds 

627.5434 
417.8881 
299.9069 
86.9364 

測試的目錄有420子目錄6812個文件。

+1

由於我必須在> 100k文件的文件夾上使用該命令,因此使用'cmd dir'解決方案可以大大提高性能。所以我選擇了你的答案(其他答案也提供了很好的信息)。 – 2015-02-06 19:28:33

1
$array = $files -split '\r?\n' 

我假設$files做的是文字分隔這將通過換行符分割字符串,並分配到$array

1

看起來像Robocopy輸出受到空白困擾。作品:

(robocopy . NULL /l /s /ndl /xx /nc /ns /njh /njs /fp) | % {gci $_.trim()} 

是否更快取決於您如何過濾文件。如果您的PS版本支持gci cmdlet的-file(因此將篩選交給文件系統提供程序),那麼PS是最快的。使用位置對象大致加倍那個時候雖然是的Robocopy在某處(爲240個文件本示例)之間:

measure-command {gci -r -file} 


Days    : 0 
Hours    : 0 
Minutes   : 0 
Seconds   : 0 
Milliseconds  : 24 
Ticks    : 245746 
TotalDays   : 2.84428240740741E-07 
TotalHours  : 6.82627777777778E-06 
TotalMinutes  : 0.000409576666666667 
TotalSeconds  : 0.0245746 
TotalMilliseconds : 24.5746 



measure-command {gci -r | ? {$_.PSIsContainer -eq $false}} 


Days    : 0 
Hours    : 0 
Minutes   : 0 
Seconds   : 0 
Milliseconds  : 48 
Ticks    : 480647 
TotalDays   : 5.56304398148148E-07 
TotalHours  : 1.33513055555556E-05 
TotalMinutes  : 0.000801078333333333 
TotalSeconds  : 0.0480647 
TotalMilliseconds : 48.0647 



measure-command {(robocopy . NULL /l /s /ndl /xx /nc /ns /njh /njs /fp)} 


Days    : 0 
Hours    : 0 
Minutes   : 0 
Seconds   : 0 
Milliseconds  : 36 
Ticks    : 365689 
TotalDays   : 4.23251157407407E-07 
TotalHours  : 1.01580277777778E-05 
TotalMinutes  : 0.000609481666666667 
TotalSeconds  : 0.0365689 
TotalMilliseconds : 36.5689