优化PowerShell模块导入

时间:2012-02-07 03:36:02

标签: optimization powershell powershell-v2.0

我目前有一个PowerShell脚本,用于复杂的自动Exchange邮箱管理。有时,脚本将同时运行20-40个实例。脚本本身不需要花费太多时间来运行;但是,该脚本需要ActiveDirectory模块,ServerManager模块和Exchange 2010 PS-snapin。只运行一个脚本实例时,加载这些模块和管理单元需要几秒钟。一旦有多个脚本实例在运行,这当然是复杂的。这最终会导致资源使用率极高,因为它试图同时加载这些模块20-40次。

问题是:

有没有办法将3个必需的模块加载到内存中,可以这么说,还是有其他方法来优化这个,任何人都可以想到,每次新实例都不需要加载这3个模块调用PowerShell脚本?

以下是简化脚本的基础知识(不包括:函数体,if语句,错误处理) - 如果您需要添加任何部分,请告诉我

CODE SNIPPIT:

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

5 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

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

功能

  

启动RSJob

有param

  

-ModulesToImport

只会加载模块一次

答案 2 :(得分:0)

所有这些脚本都是从同一个控制台会话启动的吗?

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

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

所以,在上面的代码片段中,我放了一个Write-Hello函数,它只是将“Hello,world”写入控制台。在第一行中,我在全局范围内加载了模块,然后调用了调用Write-Hello的脚本。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

也许有点晚,但是: 对提高效率也有帮助的是: http://windowsitpro.com/blog/multithreading-multitasking-powershell

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