Модули PowerShell

Содержание
Пример
Get-Module
Remove-Module
-Force
Export-ModuleMember
ModuleManifest
Похожие статьи

Простейший пример

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

Он состоит из главного скрипта main.ps1 который импортирует дополнительные функции из модуля mod.psm1

Модуль должен иметь расширение psm1 и находится в директории с таким же названием как и psm1 файл.

modules/ ├── main.ps1 └── mod └── mod.psm1

# mod.psm1 function Show-Url { param([string] $name) Write-Output "https://www.$name.ru" }

# main.ps1 Import-Module "$PSScriptRoot\mod" Show-Url "testsetup"

.\main.ps1

https://www.testsetup.ru

Get-Module

Изучить данные о модуле можно командой Get-Module

Get-Module mod

ModuleType Version PreRelease Name ExportedCommands ---------- ------- ---------- ---- ---------------- Script 0.0 mod Show-Url

В дальнейшем мы будем часто обращаться к ExportedCommands, так что отметим наличие там единственной функции Show-Url

Remove-Module

Добавим в модуль ещё одну функцию

function Show-Url { param([string] $name) Write-Output "https://www.$name.ru" } function Show-Hoster { Write-Output "https://www.beget.com" }


Get-Module не увидит это изменение. Модуль уже был сохранен в кэш и ни разу не перезаписывался с тех пор.

Get-Module mod

ModuleType Version PreRelease Name ExportedCommands ---------- ------- ---------- ---- ---------------- Script 0.0 mod Show-Url

Удалим модуль из кэша вручную

Remove-Module mod Get-Module mod

Импортируем модуль вручную

Import-Module mod Get-Module mod

ModuleType Version PreRelease Name ExportedCommands ---------- ------- ---------- ---- ---------------- Script 0.0 mod {Show-Hoster, Show-Url}

Теперь, после ручной перезагрузки модуля, Get-Module показывает обе функции.

Удалим вторую функцию и заново перезагрузим модуль.

-Force

Изменим код нашего модуля. Уберём www. и вместо https оставим http

# mod.psm1 function Show-Url { param([string] $name) Write-Output "http://$name.ru" }

После вызова main.ps1 ничего не изменилось.

.\main.ps1

https://www.testsetup.ru

Модуль сохранён в кэш, поэтому для применения изменений нужно его оттуда удалить с помощью Remove-Module

Remove-Module mod
.\main.ps1

http://testsetup.ru

Вернём mod.psm1 в исходное состояние а в main.ps1 используем опцию -Force при загрузке модуля.

# main.ps1 Import-Module "$PSScriptRoot\mod" -Force Show-Url "testsetup"

.\main.ps1

https://www.testsetup.ru

В этом случае удалять модуль из кэша вручную не потребовалось.

РЕКЛАМА хостинга Beget, которым я пользуюсь более десяти лет

Изображение баннера

Конец рекламы хостинга Beget, который я всем рекомендую.

Export-ModuleMember

Добавим в модуль ещё одну функцию.

function Show-Url { param([string] $name) Write-Output "https://www.$name.ru" } function Show-Hoster { Write-Output "https://www.beget.com" }

# main.ps1 Import-Module "$PSScriptRoot\mod" -Force Show-Url "testsetup" Show-Hoster

.\main.ps1

https://www.testsetup.ru https://www.beget.com

Обе функции успешно импортировались (благодаря -Force) и видны в Get-Module

Get-Module mod

ModuleType Version PreRelease Name ExportedCommands ---------- ------- ---------- ---- ---------------- Script 0.0 mod {Show-Hoster, Show-Url}

С помощью Export-ModuleMember мы можем управлять тем какие функции можно импортировать а какие нет.

function Show-Url { param([string] $name) Write-Output "https://www.$name.ru" } function Show-Hoster { Write-Output "https://www.beget.com" } Export-ModuleMember -Function Show-Hoster

.\main.ps1

Show-Url: C:\AutoTest\sandbox\vbox\demo\modules\main.ps1:5 Line | 5 | Show-Url "testsetup" | ~~~~~~~~ | The term 'Show-Url' is not recognized as a name of a cmdlet, function, script file, or executable program. Check the spelling of the name, or if a path was included, verify | that the path is correct and try again. https://www.beget.com

Функция Show-Url больше не доступна.

Get-Module mod

ModuleType Version PreRelease Name ExportedCommands ---------- ------- ---------- ---- ---------------- Script 0.0 mod Show-Hoster

Show-Hoster по-прежнему работает.

# main.ps1 Import-Module "$PSScriptRoot\mod" -Force Show-Hoster

.\main.ps1

https://www.beget.com

ModuleManifest

С помощью манифеста можно раскидать функционал по разным файлам внутри модуля.

Это удобно если функций в модуле становится слишком много.

Рассмотрим проект со следующей структурой

modules/ ├── main.ps1 └── mod ├── hoster.psm1 ├── mod.psd1 ├── mod.psm1 └── url.psm1

# hoster.psm1 function Show-Hoster { Write-Output "https://www.beget.com" } Export-ModuleMember -Function Show-Hoster

# url.psm1 function Show-Url { param([string] $name) Write-Output "https://www.$name.ru" } Export-ModuleMember -Function Show-Url

Несмотря на наличие манифеста, по-прежнему нужно явно перечислить все функции на экспорт.

function Write-Hi { Write-Output "Hi from mod.psm1!" } Export-ModuleMember -Function Write-Hi, Show-Hoster, Show-Url

Самая интересная часть это новый файл mod.psd1

@{ RootModule = 'mod.psm1' ModuleVersion = '1.0.0' Author = 'andreyolegovich.ru' NestedModules = @('hoster.psm1','url.psm1') FunctionsToExport = @('Write-Hi', 'Show-Hoster','Show-Url') }

Get-Module mod

ModuleType Version PreRelease Name ExportedCommands ---------- ------- ---------- ---- ---------------- Script 1.0.0 mod {Show-Hoster, Show-Url, Write-Hi}

Test-ModuleManifest mod\mod.psd1

ModuleType Version PreRelease Name ExportedCommands ---------- ------- ---------- ---- ---------------- Script 1.0.0 mod {Write-Hi, Show-Hoster, Show-Url}

Теперь можно вызвать все функции из main.ps1

# main.ps1 Import-Module "$PSScriptRoot\mod" -Force Write-Hi Show-Url "testsetup" Show-Hoster

.\main.ps1

Hi from mod.psm1! https://www.testsetup.ru https://www.beget.com

Автор статьи: Андрей Олегович

Похожие статьи
Windows
Модули
PowerShell
Get-Content
New-Item
Get-FileHash
Политики выполнения скриптов

РЕКЛАМА хостинга Beget, которым я пользуюсь более десяти лет

Изображение баннера

Конец рекламы хостинга Beget, который я всем рекомендую.

Поиск по сайту

Подпишитесь на Telegram канал @aofeed чтобы следить за выходом новых статей и обновлением старых

Перейти на канал

@aofeed

Задать вопрос в Телеграм-группе

@aofeedchat

Контакты и сотрудничество:
Рекомендую наш хостинг beget.ru
Пишите на info@urn.su если Вы:
1. Хотите написать статью для нашего сайта или перевести статью на свой родной язык.
2. Хотите разместить на сайте рекламу, подходящую по тематике.
3. Реклама на моём сайте имеет максимальный уровень цензуры. Если Вы увидели рекламный блок недопустимый для просмотра детьми школьного возраста, вызывающий шок или вводящий в заблуждение - пожалуйста свяжитесь с нами по электронной почте
4. Нашли на сайте ошибку, неточности, баг и т.д. ... .......
5. Статьи можно расшарить в соцсетях, нажав на иконку сети: