gpt4 book ai didi

powershell - 如何使用PowerShell管道有效地节省资源?

转载 作者:行者123 更新时间:2023-12-03 00:17:58 26 4
gpt4 key购买 nike

我有几个用于管理中型Microsoft Exchange组织(约10,000个邮箱)的PowerShell脚本。几个脚本以某种方式处理组织的所有邮箱。运行这些脚本时遇到的一个常见问题是资源耗尽。这些脚本最终使用GB的RAM。

我的研究表明,使用流水线可以避免内存消耗,因为结果不会在处理之前加载到数组中。但是,在某些情况下,Get-Mailbox似乎仍将整个结果列表加载到内存中,然后才尝试将这些结果传递给管道中的下一个命令。

例如,我假设以下示例代码将在命令执行后立即开始列出与每个邮箱关联的移动设备:

例1

function GetMailboxDevices
{
process
{
Write-Host $_.Alias -ForegroundColor Green
Get-MobileDevice -Mailbox $_
}
}

Get-Mailbox -ResultSize Unlimited | GetMailboxDevices

但是,在运行Get-Mailbox cmdlet时,该代码似乎无法实时处理结果。取而代之的是,Get-Mailbox似乎需要花费几分钟才能运行,然后将所有结果立即传递给管道中的第二个命令。在此过程中,PowerShell session 的RAM使用率攀升至1.5 GB或更高。

不过,我可以使用类似于以下代码的方法来解决此问题:

例子2
function GetMailboxAliases
{
process
{
Write-Host $_.Alias -ForegroundColor Green
$_.Alias
}
}

$aliases = Get-Mailbox -ResultSize Unlimited | GetMailboxAliases

foreach ($alias in $aliases)
{
Get-MobileDevice -Mailbox $alias
}

在第二个示例中,Get-Mailbox确实将每个结果实时传递给管道,而不是一次传递所有结果(Write-Host确认了这一点),并且RAM使用率并未显着增加。当然,此代码并不像我必须将别名收集到数组中然后使用foreach语句处理该数组那样优雅。

如果我在函数中执行一些简单的操作(例如,简单地返回每个邮箱的别名),则该管道似乎是有效的,但是当我在该函数中引入另一个Exchange cmdlet(例如Get-MobileDevices)后,行为就会改变。

我的问题是:为什么示例1中的代码没有有效地利用管道,而示例2中的代码却有效?可以采取哪些步骤来确保管道得到有效利用?

最佳答案

我没有使用Exchange,所以我会在脚本中这样做:

function GetMailboxDevices ($mb)
{
process
{
Write-Host $_.Alias -ForegroundColor Green
Get-MobileDevice -Mailbox $mb
}
}


Get-Mailbox -ResultSize Unlimited | Foreach-object { GetMailboxDevices $_}

要么
Get-Mailbox -ResultSize Unlimited | % { GetMailboxDevices $_}

关于powershell - 如何使用PowerShell管道有效地节省资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28683973/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com