Get-ChildItem在一个巨大的目录和RAM使用中

时间:2017-10-25 17:58:25

标签: powershell ram get-childitem

我在域控制器(SRV2012R2)上创建了一个PS脚本。

脚本检查每个共享文件夹(映射驱动器)以查看是否存在大于2GB的文件:

foreach($dir in $Dirs)
{
    $files = Get-ChildItem $dir -Recurse 

    foreach ($item in $files)
    {

       #Check if $item.Size is greater than 2GB

    }
}

我有以下问题:

这些股票充满了超过800GB的(子)文件夹,文件,其中大多数只是普通文件。

每当我运行我的脚本时,我发现CPU + RAM在运行我的脚本时消耗了大量的数据(在进入Get-Childitem行5分钟后,RAM已经达到> 4GB)。

我的问题是,为什么Get-ChildItem需要这么多资源?我可以使用哪种替代方案?因为我无法成功运行我的脚本。

我已经看到我可以在| SELECT fullname, length - 条款之后使用Get-ChildItem作为改进,但这根本没有帮助我(查询仍然消耗大量的RAM)。

我能做些什么才能在没有机器资源阻力的情况下遍历目录?

2 个答案:

答案 0 :(得分:0)

不是将每个文件保存到变量,而是使用管道过滤掉您不需要的文件(即那些小于2GB的文件):

foreach($dir in $Dirs)
{
    $bigFiles = Get-ChildItem $dir -Recurse |Where Length -gt 2GB
}

如果您需要进一步处理或分析这些大文件,我建议您使用ForEach-Object扩展该管道:

foreach($dir in $Dirs)
{
    Get-ChildItem $dir -Recurse |Where Length -gt 2GB |ForEach-Object {
      # do whatever else you must
      # $_ contains the current file
    }
}

答案 1 :(得分:0)

试试这个:

# Create an Array
$BigFilesArray = @()

#Populate it with your data
$BigFilesArray = @(ForEach-Object($dir in $dirs) {Get-ChildItem $dir -Recurse | Where-Object Length -GT 2GB})

#Number of items in the array
$BigFilesArray.Count

#Looping to get the name and size of each item in the array
ForEach-Object ($bf in $BigFilesArray) {"$($bf.name) - $($bf.length)"}

希望这有帮助!