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 хранит модули в следующих расположениях по умолчанию:
- В 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 в каталог в 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.
См. также
PowerShell