Перейти к основному содержимому

Стандартные блоки и модули PowerShell

Разработчику Архитектору Инженеру

Play ITЗагрузка интерактивного демо…


Зачем стандартные блоки

Стандартный блок — функция с ясным контрактом, которую можно вставить в разные скрипты без копипаста. Вместо одного монолита "на 400 строк" собирают цепочку: "найти старые файлы" → "сформировать имя архива" → "упаковать и удалить".

Поэтапный подход из Практическая автоматизация — модель и окупаемость — сначала рабочий скрипт для одной задачи, затем выделение повторяемых кусков в функции, затем модуль .psm1 для команды.


Анатомия блока-функции

Каждая функция для автоматизации получает три обязательных элемента:

ЭлементЗачем
[CmdletBinding()]Общие параметры -Verbose, -ErrorAction, -WhatIf
[OutputType(...)]Документирует тип результата для IDE и Get-Help
param() с типами и MandatoryРанний отказ при неверных аргументах

Пример — уникальное имя архива

Функция создаёт путь к новому .zip, проверяет папку и коллизию имён — типовой паттерн архивации логов:

Код ITЗагрузка примера кода…

Пример — файлы старше N дней

Параметр "возраст" задают положительным числом; внутри функции преобразуют в отрицательный для AddDays:

Код ITЗагрузка примера кода…

KISS

Пользователю проще передать "30 дней", чем "−30" в AddDays. Валидация ValidateRange(1, …) отсекает отрицательные значения до логики архивации.


Сборка скрипта из блоков

Скрипт верхнего уровня — оркестратор — параметры, вызов функций, журнал, код выхода.

Код ITЗагрузка примера кода…

Проблема "функции внутри .ps1": при dot-sourcing нескольких скриптов имена функций могут конфликтовать. Решение — вынести блоки в модуль.


Модуль .psm1

Модуль — каталог с файлом ИмяМодуля.psm1 (и опционально ИмяМодуля.psd1 — манифест).

Структура каталога:

ArchiveTools/
├── ArchiveTools.psd1 # манифест (версия, экспорт)
└── ArchiveTools.psm1 # функции

ArchiveTools.psm1:

function Set-ArchiveFilePath { ... } # код из примера выше

function Get-FilesOlderThan { ... }

Export-ModuleMember -Function Set-ArchiveFilePath, Get-FilesOlderThan

Минимальный ArchiveTools.psd1:

@{
ModuleVersion = '1.0.0'
RootModule = 'ArchiveTools.psm1'
FunctionsToExport = @('Set-ArchiveFilePath', 'Get-FilesOlderThan')
Description = 'Блоки архивации логов для внутренних скриптов'
}

Установка для разработки (путь добавьте в $env:PSModulePath или скопируйте в Documents\PowerShell\Modules):

Import-Module .\ArchiveTools\ArchiveTools.psd1 -Force
Get-Command -Module ArchiveTools
ДействиеКоманда
Список экспортированных функцийGet-Command -Module ArchiveTools
Справка по функции модуляGet-Help Set-ArchiveFilePath
Обновление после правкиImport-Module ... -Force

Советы по модулям для автоматизации

ПравилоПояснение
Один блок — одна задача"Имя архива" и "список файлов" — разные функции
Comment-based help в каждой функцииGet-Help без чтения исходника — см. Рекомендации по написанию PowerShell-скриптов
Install-Module вне рабочего скриптаУстановку модулей делают при подготовке образа ПК или в CI
Версии модулей фиксируютДва скрипта могут требовать разные версии одного модуля
Тестируйте блок отдельноВ консоли: Get-FilesOlderThan -Path C:\Logs -Days 7 -Verbose

Когда выносить в модуль

СитуацияРешение
Функция нужна в одном .ps1Оставить в том же файле или dot-source .\Blocks.ps1
Тот же блок в 2+ скриптахМодуль или общий .ps1 с dot-sourcing
Блок отдают другой командеМодуль + Git + 111 чек-лист
Нужна публикация в GalleryМанифест .psd1, semver, Publish-Module

Чек-лист блока

#Проверка
1Есть [CmdletBinding()] и [OutputType]
2Параметры типизированы; обязательные — Mandatory
3Ошибки — throw или -ErrorAction Stop, а не тихий $null
4Есть Write-Verbose для отладки в планировщике
5Функция возвращает объект/значение, а не только пишет в консоль

Дальше

ТемаМатериал
Запуск по расписанию и наблюдателиТриггеры — расписание и наблюдатели
Планировщик Windows, пример .ps12.05/112
Параметры, SupportsShouldProcessФункции и продвинутые параметры
Модули Gallery, Az, GraphПопулярные модули и примеры скриптов