使用Robocopy获取文件列表

4

我想知道使用Robocopy解决方案是否比使用Get-ChildItem获取给定文件夹(包括子文件夹)中的文件列表更快。

在我的代码中,我使用Get-ChildItem命令获取特定文件夹中所有文件的列表,以便循环处理每个文件:

$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的方式)呢?请保留HTML标记。

你使用的PowerShell版本是什么?如果是3.0或以上,你可以删除 where {! $_.PSIsContainer} 并只执行 $files = Get-ChildItem "C:\aaa" -Recurse -File 来仅检索文件,这可能会提高性能。 - Lance U. Matthews
@BACON,我正在使用2.0版本。 - m_power
3个回答

6

如果您只是想更快地获取文件列表,那么传统的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

测试目录中有6812个文件,分布在420个子目录中。

1
由于我必须在一个包含超过100k个文件的文件夹上使用该命令,您的解决方案使用 cmd dir 大大提高了性能。因此,我选择了您的答案(其他答案也提供了很好的信息)。 - m_power
如果你需要速度很快的话,可以看看这里:https://dev59.com/Xr3pa4cB1Zd3GeqPb08g#64029786 - Carsten

1

看起来Robocopy输出受到空格的干扰。这个命令可以解决问题:

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

是否更快取决于您如何筛选文件。如果您的PS版本支持-file用于gci cmdlet(因此将筛选交给文件系统提供程序),则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

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

我假设$files是由换行符分隔的文本。这将通过换行符将字符串分割并分配给$array

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接