优化PowerShell模块导入
我目前有一个用于复杂的自动Exchange邮箱管理的PowerShell脚本。有时,脚本将同时运行20-40个实例。脚本本身并不需要太多时间来运行;但是,该脚本需要ActiveDirectory模块,ServerManager模块和Exchange 2010 PS管理单元。只有脚本的一个实例正在运行时加载这些模块和管理单元需要几秒钟的时间。当脚本运行多个实例时,这当然是复杂的。这最终会导致资源占用极高,因为它会尝试同时加载这些模块20-40次。优化PowerShell模块导入
问题是这样的:
有什么方法来加载到内存或者保持在3个所需的模块,可以这么说,或者是有一些其他的方式来优化这一点,任何人都可以想到的,将不需要每次调用PowerShell脚本的新实例时加载这3个模块?
这里是简化了脚本的基础知识(不包括:函数体if语句,错误处理) - 让我知道如果你需要任何部分添加
代码片段:
param($ARG1,$ARG2,$ARG3) # Grab arguments from command line
# Load Modules
Import-Module ActiveDirectory
Import-Module ServerManager
Add-pssnapin Microsoft.Exchange.Management.PowerShell.E2010
# Pass Arguments to Variables
$username = $ARG1
# Create Functions
function checkValidADUser {}
function checkOldMailbox {}
function chooseMailstore {}
function createMailbox {}
# Run Functions
checkValidADUser $username
checkOldMailbox $username
chooseMailstore $username
createMailbox $username $mailstore
您可以尝试仅从每个模块加载所需的cmdlet。 关于AD模块,您可以通过禁用默认AD驱动器的加载来加速其加载。一些AD操作也可以通过Exchange命令获得,也许你可以跳过AD模块。 顺便说一下,不支持加载E2010管理单元。
$env:ADPS_LoadDefaultDrive = 0
Import-Module ActiveDirectory -Cmdlet Get-ADUser,Set-ADUser
Import-Module ServerManager ...
Add-pssnapin Microsoft.Exchange.Management.PowerShell.E2010
所有这些脚本是从同一个控制台会话开始的吗?
如果是这样,我只是将它们加载到控制台中,然后运行脚本。这样,您就可以将模块加载到当前运行空间的内存中,并且可以在该会话中的所有脚本中访问它们。
PS C:\scripts> ipmo -Name .\tempmodule.psm1 -Global
PS C:\scripts> .\temp.ps1
Hello, World
PS C:\scripts>
因此,在上面的代码片段中,我将一个Write-Hello函数写入“Hello,world”给控制台。在第一行中,我将模块加载到全局范围中,然后调用正在调用Write-Hello的脚本。
你在脚本中使用AD模块多少钱?如果您只是进行帐户验证,则可以将其更改为使用adsi,而无需加载该模块。
我不知道它是否有助于资源使用,但是如果您将Exchange管理snapin dll添加到您的GAC,它可能会加快加载时间。
AD模块正在AD用户查找,OU查询和其他几个调用之间进行大量调用。我曾尝试在一点上换出adsi,并且由于所有的调用,运行时实际上差不多慢一点。 – Eli 2012-02-07 12:37:59
也许有点晚,但: 什么也可能会提高效率帮助使用: http://windowsitpro.com/blog/multithreading-multitasking-powershell
然后在运行空间运行脚本多次。
您目前的模块是如何布置的,以及如何调用它?示例代码会很好。 – 2012-02-07 03:52:44