Командлет
Командлет (англ. cmdlet, от command-let — «команда-малютка») — это специализированная, легковесная команда, используемая в среде автоматизации задач Windows PowerShell и PowerShell Core (кроссплатформенная версия). Командлеты представляют собой основные строительные блоки для выполнения административных операций, таких как управление файлами, процессами, службами, реестром и другими компонентами операционной системы Windows, а также для работы с различными сторонними приложениями и облачными сервисами. В отличие от традиционных консольных утилит (например, ping или ipconfig), командлеты возвращают не текстовые строки, а структурированные объекты .NET, что позволяет передавать данные между командами без потери форматирования и типов.
История
Концепция командлетов возникла в рамках проекта Monad (кодовое имя Windows PowerShell), который был анонсирован корпорацией Microsoft в 2003 году. Основной целью разработчиков (Джеффри Сновер, Брюс Пейет и др.) было создание оболочки, сочетающей гибкость командной строки Unix с мощью объектно-ориентированного программирования. Первая публичная бета-версия PowerShell 1.0 вышла в 2005 году, а финальный релиз — в 2006 году. В этой версии уже было реализовано около 130 встроенных командлетов.
С выходом PowerShell 2.0 (2009 год) количество командлетов значительно увеличилось, появилась поддержка удалённого управления, модулей и расширенных функций. В 2016 году Microsoft выпустила PowerShell Core 6.0 — кроссплатформенную версию на базе .NET Core, которая стала доступна на Windows, macOS и Linux. Количество встроенных командлетов в современных версиях (PowerShell 7.x) превышает 500, а с учётом модулей от сторонних разработчиков и продуктов Microsoft (например, Azure, Exchange, Active Directory) их число достигает нескольких тысяч.
Синтаксис и именование
Командлеты следуют строгому соглашению об именовании в формате «Глагол-Существительное» (Verb-Noun). Глагол описывает действие (например, Get, Set, New, Remove, Start, Stop), а существительное — объект, над которым это действие выполняется (например, Process, Service, File, Item, User). Примеры:
Get-Process— получение списка запущенных процессов.Set-Service— изменение свойств службы.New-Item— создание нового элемента (файла, папки, ключа реестра).Remove-Item— удаление элемента.Start-Sleep— приостановка выполнения скрипта на заданное время.
Такой подход обеспечивает единообразие и интуитивную понятность: пользователь, зная глагол, может легко предсказать имя командлета для работы с любым объектом.
Параметры
Командлеты принимают параметры, которые могут быть обязательными или необязательными. Параметры бывают:
- Именованные — указываются с именем, например:
-Name "ProcessName". - Позиционные — передаются по порядку, без указания имени.
- Переключатели (switch) — логические параметры, не требующие значения (например,
-Recurseдля рекурсивного обхода). - Общие параметры — присутствуют у всех командлетов:
-Verbose,-Debug,-ErrorAction,-WarningAction,-WhatIf(имитация выполнения без реальных изменений),-Confirm(запрос подтверждения).
Типы командлетов
Встроенные командлеты
Поставляются вместе с PowerShell и охватывают базовые операции с файловой системой, реестром, процессами, службами, событиями, WMI/CIM, управлением сессиями и др. Примеры:
Get-ChildItem— аналогdirилиls, выводит содержимое папки.Copy-Item— копирование файлов и папок.Get-Help— встроенная справочная система.Get-Command— получение списка доступных командлетов и функций.
Командлеты из модулей
Модули — это пакеты, содержащие командлеты, функции, провайдеры и переменные. Они могут быть частью Windows (например, модуль ActiveDirectory для управления доменом) или устанавливаться отдельно (например, модуль Azure для управления облачными ресурсами Microsoft Azure, модуль SqlServer для работы с SQL Server). Для загрузки модуля используется команда Import-Module.
Пользовательские командлеты
Разработчики могут создавать собственные командлеты на языке C# или с помощью PowerShell-скриптов (функции, оформленные как командлеты). Для этого используются атрибуты [Cmdlet()] и [Parameter()], а также классы, наследуемые от System.Management.Automation.Cmdlet или PSCmdlet. Пример простейшего командлета на C#:
```csharp [Cmdlet(VerbsCommon.Get, "Greeting")] public class GetGreetingCommand : Cmdlet { [Parameter(Mandatory = true)] public string Name { get; set; }
protected override void ProcessRecord() { WriteObject("Hello, " + Name + "!"); } } ```
Работа с объектами
Ключевое отличие командлетов от традиционных утилит — возврат объектов .NET. Например, командлет Get-Process возвращает массив объектов System.Diagnostics.Process, каждый из которых имеет свойства (Name, Id, CPU, WorkingSet и т.д.) и методы (Kill, Refresh). Это позволяет:
- Фильтровать данные с помощью командлета
Where-Object. - Сортировать —
Sort-Object. - Выбирать нужные свойства —
Select-Object. - Группировать —
Group-Object. - Передавать объекты по конвейеру (пайпу) — символ
|.
Пример цепочки командлетов:
``powershell Get-Process | Where-Object { $_.CPU -gt 10 } | Sort-Object CPU -Descending | Select-Object Name, CPU, Id ``
Эта команда получает все процессы, фильтрует те, у которых загрузка процессора превышает 10 единиц, сортирует их по убыванию CPU и выводит только три свойства.
Применение
Администрирование Windows
Командлеты являются основным инструментом для системных администраторов Windows. С их помощью можно:
- Управлять учётными записями пользователей и групп (командлеты из модуля
ActiveDirectory). - Настраивать сетевые интерфейсы, брандмауэр, DNS.
- Работать с реестром (
Get-ItemProperty,Set-ItemProperty). - Управлять службами, процессами, планировщиком задач.
- Выполнять массовые операции с файлами и папками.
Автоматизация задач
Скрипты PowerShell, состоящие из последовательностей командлетов, позволяют автоматизировать рутинные операции: развёртывание ПО, настройку серверов, создание отчётов, мониторинг системы. Командлет New-Item с параметром -ItemType Directory может создать целую структуру папок за один вызов.
Работа с облачными сервисами
Командлеты широко используются для управления облачными ресурсами Microsoft Azure, Amazon Web Services (AWS) и Google Cloud Platform (GCP). Например, модуль Az (Azure) содержит командлеты New-AzVM, Get-AzResourceGroup, Remove-AzStorageAccount и сотни других.
Разработка и тестирование
Командлеты применяются в CI/CD-пайплайнах (например, в Azure DevOps) для сборки, тестирования и развёртывания приложений. Командлет Invoke-WebRequest позволяет отправлять HTTP-запросы и анализировать ответы.
Ограничения и критика
- Зависимость от .NET Framework / .NET Core. Для работы командлетов требуется установленная среда выполнения .NET, что может быть проблемой на очень старых или минималистичных системах.
- Сложность для новичков. Объектно-ориентированный подход и синтаксис с фигурными скобками (
$_,$PSItem) могут отпугнуть пользователей, привыкших к классическим текстовым утилитам. - Производительность. Из-за накладных расходов на создание объектов .NET командлеты могут работать медленнее, чем нативные утилиты, особенно при обработке больших объёмов данных (например,
Get-ChildItemв папке с миллионами файлов). - Несовместимость с Unix-утилитами. Хотя PowerShell Core стал кроссплатформенным, его командлеты не всегда совместимы с традиционными командами Linux (например,
grep,awk,sed), хотя существуют обёртки (Select-Stringдляgrep).
Сравнение с традиционными утилитами
| Характеристика | Командлеты PowerShell | Традиционные утилиты (cmd, bash) |
|---|---|---|
| Возвращаемые данные | Объекты .NET | Текст (строки) |
| Конвейер | Передача объектов | Передача текста (построчно) |
| Форматирование | Автоматическое (таблицы, списки) | Требует ручной настройки |
| Удалённое управление | Встроенное (WinRM, SSH) | Через сторонние средства (ssh, telnet) |
| Расширяемость | Модули, C#, скрипты | Скрипты (bat, sh), внешние программы |
Интересные факты
- Название «командлет» было предложено как уменьшительное от «команда», чтобы подчеркнуть их лёгкость и специализацию в отличие от полноценных утилит.
- В PowerShell существует специальный командлет
Get-Commandдля поиска других командлетов по шаблону, что упрощает изучение системы. - Командлеты могут быть написаны не только на C#, но и на любом языке .NET, включая F# и VB.NET.
- В PowerShell 7 появилась возможность использовать командлеты в параллельном режиме с помощью
ForEach-Object -Parallel, что ускоряет обработку больших наборов данных.
Источники
- Документация Microsoft по PowerShell: «About Cmdlets», «PowerShell Module Overview».
- Книга «Windows PowerShell in Action» (Брюс Пейет, 2007).
- Статья «PowerShell: A History» на сайте PowerShell.org.
- Официальный репозиторий PowerShell на GitHub (github.com/PowerShell/PowerShell).
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →