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


о_модулях

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

Описание установки, импорта и использования модулей 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 хранит модули в следующих расположениях по умолчанию:

  • В Windows
    • Диапазон всех пользователей — $Env:ProgramFiles\PowerShell\Modules
    • Текущая область пользователя — $HOME\Documents\PowerShell\Modules
    • Модули, поставляемые с помощью PowerShell— $PSHOME\Modules
  • В Linux и macOS
    • Диапазон всех пользователей — /usr/local/share/powershell/Modules
    • Текущая область пользователя — $HOME/.local/share/powershell/Modules
    • Модули, поставляемые с помощью PowerShell— $PSHOME/Modules

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

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

$folder = New-Item -Type Directory -Path $HOME\Documents\PowerShell\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 TestCmdlets в каталог в сеанс, введите следующее:

Import-Module C:\ps-test\TestCmdlets

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

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

Чтобы получить дополнительную информацию о добавлении модулей в сеанс, см. Импорт-модуля.

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

Команда 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 или Prefix командлета Import-Module. Параметр префикса добавляет префикс в имена импортированных команд, чтобы они были уникальными в сеансе. Параметр NoClobber не импортирует команды, которые будут скрывать или заменять существующие команды в сеансе.

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

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

См. также