Открыть сервис

Командлет

Командлет (англ. 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 →