Модуль для создания модулей и расширенных функций
[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
Перевод: Виктор Горбунков