Поиск…


Вступление

Начиная с версии PowerShell версии 2.0, разработчики могут создавать модули PowerShell. Модули PowerShell инкапсулируют набор общих функций. Например, существуют модули PowerShell, зависящие от поставщика, которые управляют различными облачными службами. Существуют также общие модули PowerShell, которые взаимодействуют со службами социальных сетей и выполняют общие задачи программирования, такие как кодирование Base64, работа с именами каналов и т. Д.

Модули могут выдавать псевдонимы команд, функции, переменные, классы и т. Д.

Создать манифест модуля

@{
  RootModule = 'MyCoolModule.psm1'
  ModuleVersion = '1.0'
  CompatiblePSEditions = @('Core')
  GUID = '6b42c995-67da-4139-be79-597a328056cc'
  Author = 'Bob Schmob'
  CompanyName = 'My Company'
  Copyright = '(c) 2017 Administrator. All rights reserved.'
  Description = 'It does cool stuff.'
  FunctionsToExport = @()
  CmdletsToExport = @()
  VariablesToExport = @()
  AliasesToExport = @()
  DscResourcesToExport = @()
}

Каждый хороший модуль PowerShell имеет манифест модуля. Модуль манифеста просто содержит метаданные о модуле PowerShell и не определяет фактическое содержимое модуля.

Файл манифеста - это файл сценария PowerShell с .psd1 файла .psd1 , содержащим HashTable. HashTable в манифесте должен содержать определенные ключи, чтобы PowerShell корректно интерпретировал его как файл модуля PowerShell.

В приведенном выше примере представлен список основных ключей HashTable, которые составляют манифест модуля, но есть много других. Команда New-ModuleManifest помогает создать новый скелет манифеста модуля.

Пример простого модуля

function Add {
  [CmdletBinding()]
  param (
    [int] $x
  , [int] $y
  )

  return $x + $y
}

Export-ModuleMember -Function Add

Это простой пример того, как может выглядеть файл модуля сценария PowerShell. Этот файл будет называться MyCoolModule.psm1 и ссылается на файл манифеста модуля (.psd1). Вы заметите, что команда Export-ModuleMember позволяет нам указать, какие функции в модуле мы хотим «экспортировать» или выставить пользователю модуля. Некоторые функции будут доступны только для внутреннего использования и не должны отображаться, поэтому они будут исключены из вызова Export-ModuleMember .

Экспорт переменной из модуля

$FirstName = 'Bob'
Export-ModuleMember -Variable FirstName

Чтобы экспортировать переменную из модуля, вы используете команду Export-ModuleMember с параметром -Variable . Помните, однако, что если переменная также явно не экспортируется в файл манифеста модуля (.psd1), то переменная не будет видна потребителю модуля. Подумайте о манифесте модуля как о «привратнике». Если функция или переменная не разрешена в манифесте модуля, она не будет видна потребителю модуля.

Примечание. Экспорт переменной аналогичен созданию поля в открытом классе. Это нецелесообразно. Было бы лучше разоблачить функцию, чтобы получить поле и функцию для установки поля.

Структурирование модулей PowerShell

Вместо того, чтобы определять все ваши функции в одном .psm1 сценария PowerShell .psm1 PowerShell, вы можете разбить свою функцию на отдельные файлы. Затем вы можете передать эти файлы из вашего файла модуля скрипта, что, по сути, относится к ним так, как если бы они были частью самого файла .psm1 .

Рассмотрим эту структуру каталога модуля:

\MyCoolModule
  \Functions
    Function1.ps1
    Function2.ps1
    Function3.ps1
MyCoolModule.psd1
MyCoolModule.psm1

Внутри файла MyCoolModule.psm1 вы можете вставить следующий код:

Get-ChildItem -Path $PSScriptRoot\Functions | 
  ForEach-Object -Process { . $PSItem.FullName }

Это будет точечный источник отдельных файлов функций в .psm1 модуля .psm1 .

Расположение модулей

PowerShell ищет модули в каталогах, перечисленных в пути $ Env: PSModule.

Модуль, называемый foo , в папке с именем foo будет найден с помощью Import-Module foo

В этой папке PowerShell будет искать манифест модуля (foo.psd1), файл модуля (foo.psm1), DLL (foo.dll).

Видимость члена модуля

По умолчанию только функции, определенные в модуле, видны вне модуля. Другими словами, если вы определяете переменные и псевдонимы в модуле, они не будут доступны, кроме кода модуля.

Чтобы переопределить это поведение, вы можете использовать командлет Export-ModuleMember . Он имеет параметры, называемые -Function , -Variable и -Alias которые позволяют вам точно указать, какие элементы экспортируются.

Важно отметить, что если вы используете Export-ModuleMember , будут видны только указанные вами элементы.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow