我在域控制器(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)。
我能做些什么才能在没有机器资源阻力的情况下遍历目录?
答案 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)"}
希望这有帮助!