使用 Robocopy 获取文件列表
Get file list with Robocopy
我正在尝试查看使用 Robocopy 的解决方案是否比使用 Get-ChildItem
获取给定文件夹(和子文件夹...)内的文件列表更快。
在我的代码中,我使用 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
?
$array = $files -split '\r?\n'
我假设 $files
是由换行符分隔的文本。这将按换行符拆分字符串并分配给 $array
.
看起来 Robocopy 输出受到了白色 space 的困扰。这有效:
(robocopy . NULL /l /s /ndl /xx /nc /ns /njh /njs /fp) | % {gci $_.trim()}
是否更快取决于您如何过滤文件。如果您的 PS 版本支持 gci
cmdlet 的 -file
(因此将过滤交给文件系统提供商),那么 PS 是最快的。使用 Where-Object 大约使时间翻倍,而 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
如果您只是想寻找一种更快的方法来获取该文件列表,旧的 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个文件
我正在尝试查看使用 Robocopy 的解决方案是否比使用 Get-ChildItem
获取给定文件夹(和子文件夹...)内的文件列表更快。
在我的代码中,我使用 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
?
$array = $files -split '\r?\n'
我假设 $files
是由换行符分隔的文本。这将按换行符拆分字符串并分配给 $array
.
看起来 Robocopy 输出受到了白色 space 的困扰。这有效:
(robocopy . NULL /l /s /ndl /xx /nc /ns /njh /njs /fp) | % {gci $_.trim()}
是否更快取决于您如何过滤文件。如果您的 PS 版本支持 gci
cmdlet 的 -file
(因此将过滤交给文件系统提供商),那么 PS 是最快的。使用 Where-Object 大约使时间翻倍,而 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
如果您只是想寻找一种更快的方法来获取该文件列表,旧的 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个文件