Модуль для создания модулей и расширенных функций

[1/3/09 Дополнение – оригинальная ссылка на присоединенный файл, содержащий этот код, была с ошибкой, которая теперь исправлена. Извините. jps]

Трудно переоценить важность модулей и расширенных функций. Если используете PowerShell – вам необходимо уделить время изучению этих новых механизмов и применять их в качестве наиболее предпочтительного варианта реализации новых функций. Причина в том, что эти механизмы являются важнейшими технологиями позволяющими нам ОБМЕНИВАТЬСЯ ДРУГ С ДРУГОМ И СОВМЕСТНО ИСПОЛЬЗОВАТЬ КОД.

Расширенные функции обеспечивают справку, завершение параметров с помощью табуляции и семантику коммандлетов, что упрощает использование ваших функций другими людьми. Тем кто хочет по-прежнему читать исходный код, чтобы узнать, что делает функция – вам нужна справка. Желающим гадать о значении параметров – нужно автодополнение с помощью табуляции. Тем кто хочет использовать функцию, которая может давать неожиданные результаты – нужно использовать -WHATIF -CONFIRM и -VERBOSE.

Модули упрощают упаковку функций и их использование без взаимных конфликтов. Кстати, не уверен объяснил ли я что модули обеспечивают альтернативный механизм позволяющий делать то же, что делает механизм PSSNAPIN. На самом деле командлеты *-module работают и с модулями написанными на PowerShell, и с компилированными библиотеками DLL. Преимущество модулей перед snap-in в том, что их можно развертывать с помощью команды xcopy.

Единственный отрицательный момент в использовании модулей и расширенных функций состоит в том, что они требуют дополнительных действий в при написании кода. Поэтому я написал модуль Module (это, возможно, и ужасное имя, но я пока что пользуюсь именно им). Этот модуль делает создание модулей и расширенных функций простым делом и является хорошим примером и тех, и других.

 PS> Import-Module Module 
PS> Get-Command -Module Module 
CommandType     Name                          Definition 
-----------     ----                          ---------- 
Function        New-GUID                      ... 
Function        New-ModuleTemplate            ... 
Function        New-PSScript                  ... 

New-PSScript требует указать ГЛАГОЛ (VERB) и СУЩЕСТВИТЕЛЬНОЕ (NOUN), (он может принимать также несколько дополнительных параметров), и создает тело сценария или функции, содержащее справочные комментарии. Затем вы можете перенаправить его вывод в файл. Ниже приведен пример использования New-PSScript:

 

 PS> New-PSScript -Verb Get -Noun MyProcess -Parameter ID ` 
>> -Synopsis "Это моя версия GetProcess" 
>> 
<# 
.Synopsis 
   Это моя версия GetProcess 
.Description 
    QQDescription 
.Parameter ID 
.Example 
    Get-MyProcess 
.ReturnValue 
    QQReturnValue 
.Link 
    QQLink 
.Notes 
NAME:      Get-MyProcess 
AUTHOR:    RugratsVista\jsnover 
LASTEDIT:  01/02/2009 10:10:24 
#Requires -Version 2.0 
#> 
[CmdletBinding( 
    SupportsShouldProcess=$False, 
    SupportsTransactions=$False, 
    ConfirmImpact="None", 
    DefaultParameterSetName="")] 
param( 
[Parameter(Position=0)] 
$ID 
) 
Begin 
{ 
}#Begin 
Process 
{ 
    Throw "Еще не реализовано " 
}#Process 
End 
{ 
}#End

 

New-ModuleTemplate делает что-то подобное для модулей. Он требует ИМЯ (NAME) и создает файл .PSD1, описывающий модуль и файл .PSM1 с функцией GET-NAME. Одной из удобных возможностей этой команды является то, что она понимает флаг -EDIT, и если вы укажете его, созданные файлы откроются в Powershell_ISE, так что вы сможете немедленно начать писать свой код.

Установите модуль, скопировав файлы в каталог MODULE в вашем каталоге модулей:

($Env:PSMODULEPATH -Split ";")[0]

Если вы еще не создали каталог для своих модулей, можете сделать это следующей командой:

 PS> New-Item –Type Containter –Force –path ($Env:PSMODULEPATH -Split ";")[0]

Если вы похожи на меня, то не захотите каждый раз набирать эту ерунду, так что когда вы сделаете import-Module Module, первое что она сделает, это создаст для вас PSDRIVE под названием MYMOD.

 New-PsDrive -Scope Global -Name MyMod -PSProvider FileSystem -Root (($env:PSMODULEPATH -split ";")[0])

Дайте этой штуке шанс и расскажите мне, что вы об этом думаете. У нее есть HELP, и он содержит подробные примеры того, как все это работает.

Скажу еще раз – трудно переоценить, насколько важно начать использовать модули и расширенные функции. Вам действительно следует начать использовать их уже сегодня и сообщить нам, нет ли в них каких-то ошибок, проблем или возможностей для улучшения. У нас мало времени для внесения изменений в V2 (Powershell версии 2), так что давайте начнем прямо сегодня.

Наслаждайтесь!

Джеффри Сновер (Jeffrey Snover) [MSFT]
Windows Management Partner Architect
Посетите английский блог команды  Windows PowerShell:    https://blogs.msdn.com/PowerShell
Посетите Windows PowerShell ScriptCenter:  https://www.microsoft.com/technet/scriptcenter/hubs/msh.mspx

Перевод: Виктор Горбунков