Оптимизация импорта модулей PowerShell - PullRequest
5 голосов
/ 07 февраля 2012

В настоящее время у меня есть сценарий PowerShell, который используется для комплексного автоматизированного управления почтовыми ящиками Exchange. Время от времени скрипт будет запускать 20-40 экземпляров одновременно. Тело самого сценария не требует много времени для запуска; однако для сценария требуются модуль ActiveDirectory, модуль ServerManager и PS-оснастка Exchange 2010. Загрузка этих модулей и оснасток занимает несколько секунд, когда запущен только 1 экземпляр скрипта. Это, конечно, усложняется, если запущено несколько экземпляров скрипта. Это приводит к чрезмерному использованию ресурсов, так как он пытается загрузить эти модули 20-40 раз одновременно.

Вопрос такой:

Есть ли какой-либо способ сохранить 3 требуемых модуля в памяти, если можно так выразиться, или есть какой-то другой способ оптимизировать этот процесс, о котором каждый может подумать, что он не потребует загрузки этих 3 модулей каждый раз, когда создается новый экземпляр скрипта PowerShell вызывается?

Вот основы упрощенного скрипта (без: тел функций, операторов 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

Ответы [ 5 ]

5 голосов
/ 07 февраля 2012

Вы можете попробовать загрузить только необходимые командлеты из каждого модуля.Что касается модуля 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 голос
/ 15 августа 2017

Вы можете взглянуть на PoshRSJob https://github.com/proxb/PoshRSJob

Функция

Запуск RSJob

имеет параметр

-ModulesToImport

, который загружает модули только один раз

0 голосов
/ 22 июля 2014

Возможно, немного поздно, но: Что может также помочь в увеличении эффективности, использует: http://windowsitpro.com/blog/multithreading-multitasking-powershell

Затем запустите ваш сценарий несколько раз в этом пространстве выполнения.

0 голосов
/ 07 февраля 2012

Сколько вы используете этот модуль AD в сценарии?Если вы просто проводите проверку учетной записи, вы можете изменить ее на использование рекламы и не загружать этот модуль вообще.

Не знаю, поможет ли это с использованием ресурса, ноэто может ускорить время загрузки, если вы добавите эту DLL оснастки управления Exchange в ваш GAC.

0 голосов
/ 07 февраля 2012

Все ли эти сценарии запущены из одного сеанса консоли?

Если это так, я просто загрузил бы их в консоль и затем запустил скрипт. Таким образом, у вас есть модули, загруженные в память текущего пространства выполнения и доступные для всех сценариев в этом сеансе.

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

Итак, в приведенном выше фрагменте я поместил функцию Write-Hello, которая просто записывает «Hello, world» в консоль. В первой строке я загрузил модуль в глобальной области видимости, а затем вызвал скрипт, который вызывал Write-Hello.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...