优化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 
+0

您目前的模块是如何布置的,以及如何调用它?示例代码会很好。 – 2012-02-07 03:52:44

您可以尝试仅从每个模块加载所需的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 
+0

谢谢,我将尝试加载个别Cmdlet。是的,我知道它不被支持;不幸的是,由于我们的IDM解决方案,这是目前我们完成自动化Exchange管理的唯一方法。 – Eli 2012-02-07 13:27:21

+0

您是否尝试连接到Exchange服务器上的IIS端点? – 2012-02-07 13:50:38

+0

谢谢! - 只加载特定的CMDlets非常有帮助。 – Eli 2012-02-07 22:44:37

所有这些脚本是从同一个控制台会话开始的吗?

如果是这样,我只是将它们加载到控制台中,然后运行脚本。这样,您就可以将模块加载到当前运行空间的内存中,并且可以在该会话中的所有脚本中访问它们。

PS C:\scripts> ipmo -Name .\tempmodule.psm1 -Global 
PS C:\scripts> .\temp.ps1 
Hello, World 
PS C:\scripts> 

因此,在上面的代码片段中,我将一个Write-Hello函数写入“Hello,world”给控制台。在第一行中,我将模块加载到全局范围中,然后调用正在调用Write-Hello的脚本。

+0

不,有一个外部身份管理解决方案,用这个用户名作为ARG1 – Eli 2012-02-07 04:59:29

+0

来呼叫此服务器来执行PowerShell脚本好吧,我想不出在这种情况下共享加载的模块的方法。 – ravikanth 2012-02-07 05:01:33

你在脚本中使用AD模块多少钱?如果您只是进行帐户验证,则可以将其更改为使用adsi,而无需加载该模块。

我不知道它是否有助于资源使用,但是如果您将Exchange管理snapin dll添加到您的GAC,它可能会加快加载时间。

+0

AD模块正在AD用户查找,OU查询和其他几个调用之间进行大量调用。我曾尝试在一点上换出adsi,并且由于所有的调用,运行时实际上差不多慢一点。 – Eli 2012-02-07 12:37:59

也许有点晚,但: 什么也可能会提高效率帮助使用: http://windowsitpro.com/blog/multithreading-multitasking-powershell

然后在运行空间运行脚本多次。

你可以看看PoshRSJob https://github.com/proxb/PoshRSJob

功能

启动RSJob

具有帕拉姆

-ModulesToImport

这将只加载模块一次