Поделиться через


about_Modules

Краткое описание

Описание установки, импорта и использования модулей PowerShell.

Подробное описание

PowerShell — это командная оболочка и язык сценариев. Команды в PowerShell реализуются как скрипты, функции или командлеты. Язык содержит ключевые слова, которые предоставляют структуру и логику обработки, а также другие ресурсы, такие как переменные, поставщики, псевдонимы.

Модуль является автономной, многократно используемой единицей, которая может включать командлеты, поставщики, функции, переменные и другие ресурсы. По умолчанию PowerShell автоматически загружает установленный модуль при первом использовании команды из модуля. Вы можете настроить автоматическое поведение загрузки модуля с помощью переменной $PSModuleAutoloadingPreference. Дополнительные сведения см. в about_Preference_Variables.

Вы также можете вручную загрузить или выгрузить модули во время сеанса PowerShell. Чтобы загрузить или перезагрузить модуль, используйте Import-Module. Чтобы выгрузить модуль, используйте Remove-Module командлет.

PowerShell включает базовый набор модулей. Любой пользователь может создавать новые модули с помощью C# или самого языка сценариев PowerShell. Модули, написанные на C# как скомпилированные сборки .NET, называются собственными модулями. Модули, написанные в PowerShell, называются модулями скриптов.

В этой статье объясняется, как использовать модули PowerShell. Сведения о создании модулей PowerShell см. в статье "Написание модуля PowerShell".

Примечание.

До PowerShell 3.0 командлеты и поставщики были упаковываются в оснастки PowerShell. Начиная с PowerShell 3.0, оснастка Microsoft.PowerShell.Core добавляется в каждый сеанс по умолчанию. Это единственная оснастка, оставшаяся в PowerShell. Все остальные оснастки были преобразованы в модули. Создание новых оснастки больше не поддерживается.

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

PowerShell хранит модули в следующих расположениях по умолчанию:

  • Область всех пользователей — $env:ProgramFiles\WindowsPowerShell\Modules
  • Текущая область пользователя — $HOME\Documents\WindowsPowerShell\Modules
  • Модули, поставляемые с помощью PowerShell, — $PSHOME\Modules

По умолчанию Modules папка для текущего пользователя не существует. Если вы установили модуль в CurrentUser области или Install-Module Install-PSResourceэти командлеты создают папку Modules для текущего пользователя. Если папка не существует, ее можно создать вручную.

Используйте следующую команду, чтобы создать папку Modules для текущего пользователя:

$folder = New-Item -Type Directory -Path $HOME\Documents\WindowsPowerShell\Modules

Эти расположения автоматически включаются в $env:PSModulePath переменную среды. Дополнительные сведения о расположениях модулей по умолчанию см. в about_PSModulePath.

Автоматическая загрузка модуля

При первом выполнении команды из установленного модуля PowerShell автоматически импортирует (загружает) этот модуль. Модуль должен храниться в расположениях, указанных в переменной $env:PSModulePath среды.

Автоматическая загрузка модуля позволяет использовать команды в модуле без настройки или настройки профиля. Каждый из следующих примеров приводит к импорту модуля CimCmdlets , содержащегося Get-CimInstanceв сеансе.

  • Выполнение команды

    Get-CimInstance Win32_OperatingSystem
    
  • Получение команды

    Get-Command Get-CimInstance
    
  • Получение справки по команде

    Get-Help Get-CimInstance
    

При использовании Get-Command с подстановочным символом (*), PowerShell не импортирует модули. Для обнаружения команд можно использовать подстановочные знаки без загрузки модулей, которые могут не потребоваться в сеансе.

Импорт модуля вручную

Импорт модуля вручную требуется, если модуль не установлен в расположениях, указанных $env:PSModulePath переменной среды, или когда модуль предоставляется как автономный .dll или .psm1 файл, а не упакованный модуль.

Кроме того, команды, использующие поставщики PowerShell, не импортируют модуль автоматически. Например, если вы используете команду, требующую WSMan: диск, например Get-PSSessionConfiguration командлет, может потребоваться выполнить Import-Module командлет для импорта модуля Microsoft.WSMan.Management , включающего WSMan: диск.

Кроме того, может потребоваться изменить способ импорта модуля в сеансе. Например, параметр Import-Module префикса добавляет отличительный префикс в часть существительных командлетов, импортированных из модуля. Параметр NoClobber запрещает модулю добавлять команды, которые будут скрывать или заменять существующие команды в сеансе. Дополнительные сведения см. в разделе "Управление конфликтами имен".

В следующем примере модуль BitsTransfer импортируется в текущий сеанс.

Import-Module BitsTransfer

Чтобы импортировать модуль, который не имеется, $env:PSModulePathиспользуйте полный путь к папке модуля. Например, чтобы добавить модуль TestCmdlets в каталог в C:\ps-test сеанс, введите:

Import-Module C:\ps-test\TestCmdlets

Чтобы импортировать файл модуля, который не содержится в папке модуля, используйте полный путь к файлу модуля в команде. Например, чтобы добавить модуль TestCmdlets.dll в каталог в C:\ps-test сеанс, введите следующее:

Import-Module C:\ps-test\TestCmdlets.dll

Дополнительные сведения о добавлении модулей в сеанс см. в разделе Import-Module.

Импорт модуля в начале каждого сеанса

Команда Import-Module импортирует модули в текущий сеанс PowerShell. Чтобы импортировать модуль в каждый начальный сеанс PowerShell, добавьте Import-Module команду в профиль PowerShell.

Дополнительные сведения о профилях см. в about_Profiles.

Установка опубликованного модуля

Опубликованный модуль — это модуль, доступный из зарегистрированного репозитория, например коллекция PowerShell. Модули PowerShellGet и Microsoft.PowerShell.PSResourceGet предоставляют командлеты для поиска, установки и публикации модулей PowerShell в зарегистрированном репозитории.

Модуль PowerShellGet входит в состав PowerShell 5.0 и более поздних выпусков. Модуль Microsoft.PowerShell.PSResourceGet входит в состав PowerShell 7.4 и более поздних выпусков и является предпочтительным диспетчером пакетов для PowerShell. Microsoft.PowerShell.PSResourceGet можно установить параллельно с PowerShellGet на более ранних версиях PowerShell. Install-Module Используйте командлет для Install-PSResource установки модулей из коллекция PowerShell.

 Get-Command Install-Module, Install-PSResource
CommandType  Name                Version    Source
-----------  ----                -------    ------
Function     Install-Module      2.9.0      PowerShellGet
Cmdlet       Install-PSResource  1.0.0      Microsoft.PowerShell.PSResourceGet

Дополнительные сведения см. в разделе "Обзор PowerShellGet".

Установка модуля вручную

Вы можете вручную установить модуль, скопировав содержимое модуля из другой папки. Эта папка может находиться в другом расположении на локальном компьютере или на другом компьютере. Чтобы установить модуль вручную, скопируйте всю папку модуля в новое расположение, включено в ваше.$env:PSModulePath

В PowerShell используйте Copy-Item командлет. Например, выполните следующую команду, чтобы скопировать папку MyModule из C:\PSTest:

$modulePath = $HOME\Documents\PowerShell\Modules\MyModule
Copy-Item -Path C:\PSTest\MyModule\* -Destination $modulePath -Recurse

Установить модуль можно в любое местоположение, однако если всегда устанавливать их в местоположение модулей по умолчанию, ими проще управлять.

Поиск установленных модулей

Командлет Get-Module получает модули PowerShell, загруженные в текущем сеансе PowerShell.

Get-Module

Перечисленные модули могут включать модули, импортированные из любого расположения, а не только из $env:PSModulePath.

Используйте следующую команду для перечисления модулей, установленных в :$env:PSModulePath

Get-Module -ListAvailable

Эта команда получает все модули, установленные в $env:PSModulePath, а не только модули, импортированные в текущий сеанс. Эта команда не выводит список модулей, установленных в других расположениях.

Дополнительные сведения см. в разделе Get-Module.

Вывод списка команд в модуле

Get-Command Используйте командлет для поиска всех доступных команд. Параметры командлета Get-Command можно использовать для фильтрации таких команд, как модуль, имя и существительное.

Чтобы найти все команды в модуле, введите следующее:

Get-Command -Module <module-name>

Например, чтобы найти команды в модуле BitsTransfer , введите:

Get-Command -Module BitsTransfer

Дополнительные сведения о командлете Get-Command см. в разделе Get-Command.

Удаление модуля

Если удалить модуль, добавленные им команды удаляются из сеанса. Например, следующая команда удаляет модуль BitsTransfer из текущего сеанса.

Remove-Module BitsTransfer

Удаление модуля отменяет операцию импорта модуля. Удаление модуля не удаляет модуль. Дополнительные сведения см. в разделе Remove-Module.

Команды можно добавить в сеанс из модулей и оснастки. Модули могут добавлять все типы команд, включая командлеты, поставщики и функции, а также элементы, такие как переменные, псевдонимы и диски PowerShell. Из оснасток можно добавлять только командлеты и поставщики.

Перед удалением модуля из сеанса используйте следующие команды, чтобы определить, какой модуль нужно удалить.

Например, используйте следующую команду, чтобы найти источник Get-Date командлетов и Get-Help командлетов:

Get-Command Get-Date, Get-Help -All |
    Select-Object -Property Name, CommandType, Module ,PSSnapIn

В следующих выходных данных показано, что Get-Help командлет находится в оснастке Microsoft.PowerShell.Core . Эту оснастку нельзя удалить из сеанса.

Name     CommandType Module                       PSSnapIn
----     ----------- ------                       --------
Get-Date    Function
Get-Date      Cmdlet Microsoft.PowerShell.Utility
Get-Help      Cmdlet                              Microsoft.PowerShell.Core

Существует два источника для Get-Date. Одна из них — это функция, а другая — командлет в модуле Microsoft.PowerShell.Utility . Вы можете удалить модуль с помощью Remove-Module. Чтобы удалить функцию, ее можно удалить с Function: диска.

Remove-Item Function:Get-Date

Дополнительные сведения о диске см. в Function: about_Function_Provider.

Управление конфликтами имен

Конфликт имен происходит, когда в сеансе имеется несколько команд с одинаковым именем. При импорте модуля возникает конфликт имен, если содержащиеся в нем команды имеют такие же имена, как команды или элементы, уже имеющиеся в сеансе.

Import-Module может добавлять команды, которые скрывают и заменяют команды в текущем сеансе. Конфликты имен могут возникать в результате скрытия или замены команд. Замена команд возникает, когда импортированный модуль содержит команду с тем же именем, что и существующая команда в сеансе. Недавно импортированная команда имеет приоритет над существующей командой.

Например, если сеанс включает функцию и командлет с тем же именем, PowerShell выполняет функцию по умолчанию. Если сеанс содержит команды одинакового типа (например, два командлета) с одинаковым именем, по умолчанию выполняется команда, добавленная последней.

Дополнительные сведения, включая описание правил приоритета и инструкций по выполнению скрытых команд, см . в about_Command_Precedence.

Вы можете выполнить скрытую или замененную команду, указав имя команды. Чтобы указать имя команды, добавьте имя модуля, содержащего нужную версию команды. Например:

Microsoft.PowerShell.Utility\Get-Date

Выполнение Get-Date с префиксом имени модуля гарантирует, что версия выполняется из модуля Microsoft.PowerShell.Utility .

Чтобы обнаружить конфликты имен, используйте параметр All командлета Get-Command . По умолчанию Get-Command получает только те команды, которые выполняются при вводе имени команды. Параметр All получает все команды с определенным именем в сеансе.

Чтобы предотвратить конфликты имен, используйте параметры NoClobber или Префикса командлетаImport-Module. Параметр Префикса добавляет префикс в имена импортированных команд, чтобы они были уникальными в сеансе. Параметр NoClobber не импортирует какие-либо команды, которые будут скрывать или заменять существующие команды в сеансе.

Вы также можете использовать параметры Import-Module псевдонима, командлета, функции и переменной, чтобы выбрать только команды, которые требуется импортировать, и вы можете исключить команды, вызывающие конфликты имен в сеансе.

Авторы модулей могут предотвратить конфликты имен с помощью свойства DefaultCommandPrefix манифеста модуля, чтобы добавить префикс по умолчанию ко всем именам команд. Значение параметра Префикса имеет приоритет над значением DefaultCommandPrefix.

См. также