在Powershell中计数达到一定数量后限制GCI

时间:2018-02-02 09:42:14

标签: powershell

我目前使用的脚本监视某些关键文件夹中的文件数量,以便运营团队密切关注并根据数字做出决策。该脚本运行良好,如下所示:

$folders = @("c:\temp", "C:\temp\tosh")
$results = @()
foreach ($folder in $folders) {
    $folderFiles = Get-ChildItem -Path $folder -File | Where-Object { $_.Name -like "abc*.xml" }
    $obj = New-Object psobject -Property @{
        Folder = $folder
        Count = $folderFiles.count
    }
    $results += $obj
}
$results | format-table

但是,当其中一个文件夹中的xml个文件数量很大(20k +左右)而GCI需要60s +才能返回结果时,我会遇到问题。

我想知道,如果$folderFiles对象达到设定数量(例如5000的数量),我有没有办法停止GCI?这使我能够在$results表中显示5000+作为文件计数。

我已经考虑过使用Select-Object,但是假设这会执行整个GCI,那么只有在完成后才会限制?

$folderFiles = Get-ChildItem -path $folder -File | Select-Object -First 5000

任何建议表示赞赏。

1 个答案:

答案 0 :(得分:2)

您可以使用较小的样本进行测试,以查看结果。 Measure-Command是查看代码部分执行情况的有用工具:

这是我对大约500个文件的文件夹进行的测试:

Measure-Command { Get-ChildItem -File }

Measure-Command { Get-ChildItem -File | Select-Object -First 250 }

结果:

Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 0
Milliseconds      : 26
Ticks             : 263370
TotalDays         : 3.04826388888889E-07
TotalHours        : 7.31583333333333E-06
TotalMinutes      : 0.00043895
TotalSeconds      : 0.026337
TotalMilliseconds : 26.337

Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 0
Milliseconds      : 13
Ticks             : 132462
TotalDays         : 1.533125E-07
TotalHours        : 3.6795E-06
TotalMinutes      : 0.00022077
TotalSeconds      : 0.0132462
TotalMilliseconds : 13.2462

您可以看到使用Select确实提高了代码的性能。