Командлеты
Командлет (от англ. cmdlet, произносится «командлет») — это специализированная лёгкая команда, используемая в среде автоматизации задач Windows PowerShell и PowerShell Core. Командлеты представляют собой скомпилированные классы на платформе .NET (или .NET Core), которые выполняют одну конкретную функцию, возвращая результат в виде объектов, а не текста. В отличие от традиционных консольных утилит, командлеты спроектированы для работы в конвейере (pipeline) и следуют единой парадигме «глагол-существительное» (например, Get-Process, Set-Item, Remove-Variable).
История
Концепция командлетов была разработана корпорацией Microsoft в рамках проекта Monad (кодовое имя Windows PowerShell), начатого в 2002 году. Основной целью было создание оболочки, которая оперирует объектами, а не текстовыми строками, что позволяло бы автоматизировать администрирование Windows более эффективно, чем в классической командной строке (cmd.exe). Первая публичная версия PowerShell 1.0 вышла в 2006 году для Windows XP, Windows Server 2003 и Windows Vista. Вместе с ней появились первые встроенные командлеты, такие как Get-Command, Get-Help и Get-Member.
С выходом PowerShell 2.0 в 2009 году количество встроенных командлетов значительно увеличилось, а также была добавлена поддержка удалённого управления. В 2016 году Microsoft выпустила PowerShell Core — кроссплатформенную версию на базе .NET Core, что позволило использовать командлеты в Linux и macOS. Начиная с PowerShell 7 (2020 год), платформа стала единой для всех операционных систем, а набор командлетов расширился за счёт модульной архитектуры.
Классификация
Командлеты делятся на несколько категорий в зависимости от источника и назначения:
По происхождению
- Встроенные (built-in) — поставляются вместе с PowerShell (например,
Get-ChildItem,Write-Output). - Модульные (module-based) — загружаются из внешних модулей, которые могут быть установлены из репозитория PowerShell Gallery или вручную (например,
Import-Module ActiveDirectory). - Пользовательские (custom) — создаются разработчиками или администраторами с помощью языков C# или самого PowerShell (через
Add-TypeилиNew-Module).
По функциональности
- Глаголы — определяют действие:
Get-— получение данных (например,Get-Process).Set-— изменение данных (например,Set-ItemProperty).New-— создание объектов (например,New-Item).Remove-— удаление (например,Remove-Item).Invoke-— выполнение действия (например,Invoke-Command).Start-,Stop-,Restart-— управление службами и процессами.- Существительные — указывают на объект воздействия (например,
Service,Process,File,RegistryKey).
По области применения
- Системные — работа с файловой системой, реестром, процессами, службами.
- Сетевые — управление сетевыми адаптерами, DNS, IP-адресами.
- Управление конфигурациями — Desired State Configuration (DSC).
- Облачные — для Azure, AWS, Google Cloud (через сторонние модули).
Устройство и характеристики
Каждый командлет представляет собой экземпляр класса, производного от System.Management.Automation.Cmdlet или PSCmdlet. Основные элементы:
- Параметры — аргументы, передаваемые командлету. Могут быть обязательными, позиционными, именованными или принимать значения из конвейера.
- Конвейер — механизм передачи объектов от одного командлета к другому с помощью символа
|. Например,Get-Process | Where-Object {$_.CPU -gt 100}. - Возвращаемое значение — всегда объекты .NET, а не текст. Это позволяет использовать свойства и методы объектов в дальнейших операциях.
- Обработка ошибок — командлеты поддерживают
-ErrorAction,-ErrorVariable,-WarningActionи другие общие параметры. - Поддержка справки — каждый командлет имеет встроенную справку, доступную через
Get-Help <имя_командлета>.
Ключевая особенность командлетов — детерминированное поведение: они не могут быть запущены как фоновые процессы (в отличие от обычных программ) и выполняются синхронно в рамках сессии PowerShell.
Применение
Командлеты используются в следующих сценариях:
- Администрирование Windows — управление пользователями, группами, службами, реестром, файловыми системами. Например,
New-LocalUserсоздаёт локального пользователя, аSet-Serviceизменяет параметры службы. - Автоматизация развёртывания — с помощью командлетов PowerShell можно разворачивать приложения, настраивать серверы и обновлять конфигурации.
- Работа с облачными сервисами — модуль
Az(Azure PowerShell) содержит сотни командлетов для управления ресурсами Microsoft Azure. Аналогичные модули существуют для AWS и Google Cloud. - Управление Active Directory — модуль
ActiveDirectoryпредоставляет командлеты для работы с доменными службами, напримерGet-ADUser,Set-ADGroup. - Сбор и обработка данных — командлеты
Select-Object,Sort-Object,Group-Object,Measure-Objectпозволяют фильтровать, сортировать и агрегировать данные. - Создание отчётов — данные, полученные через командлеты, могут быть экспортированы в CSV, JSON, XML или HTML с помощью
Export-Csv,ConvertTo-JsonиConvertTo-Html.
Примеры
Ниже приведены типичные примеры использования командлетов:
- Получение списка всех запущенных процессов, использующих более 100 МБ памяти:
``powershell Get-Process | Where-Object {$_.WorkingSet -gt 100MB} ``
- Создание новой папки в текущем каталоге:
``powershell New-Item -Path ".\NewFolder" -ItemType Directory ``
- Остановка службы с именем «Spooler»:
``powershell Stop-Service -Name Spooler ``
- Получение справки по командлету
Get-ChildItem:
``powershell Get-Help Get-ChildItem -Detailed ``
- Экспорт списка всех установленных программ в CSV-файл:
``powershell Get-WmiObject Win32_Product | Export-Csv -Path "C:\programs.csv" -NoTypeInformation ``
Интересные факты
- Название «командлет» является калькой с английского cmdlet, которое, в свою очередь, образовано от command-let («маленькая команда»).
- В PowerShell существует более 200 встроенных командлетов, а общее количество доступных через модули может превышать несколько тысяч.
- Командлеты могут быть написаны не только на C#, но и на самом PowerShell с использованием ключевого слова
function, однако такие функции не являются полноценными командлетами, так как не поддерживают некоторые продвинутые возможности (например, обработку конвейера на уровне .NET). - В отличие от Unix-подобных оболочек (bash, zsh), где команды — это отдельные исполняемые файлы, командлеты загружаются в память как DLL-библиотеки, что обеспечивает более высокую производительность при повторных вызовах.
- С выходом PowerShell 7 была добавлена поддержка параллельного выполнения командлетов с помощью
ForEach-Object -Parallel.
Критика
Несмотря на широкое распространение, командлеты имеют ряд недостатков:
- Зависимость от платформы .NET — хотя PowerShell Core стал кроссплатформенным, многие командлеты (особенно для Windows) не работают в Linux или macOS.
- Сложность для новичков — объектно-ориентированный подход требует понимания .NET-типов и свойств, что усложняет обучение по сравнению с текстовыми оболочками.
- Ограниченная совместимость — командлеты из разных модулей могут конфликтовать по именам (например, два модуля могут содержать командлет с одинаковым именем
Get-User). - Производительность — при обработке больших объёмов данных через конвейер командлеты могут работать медленнее, чем специализированные утилиты, написанные на C++ или Rust.
Источники
- Microsoft Docs. «Windows PowerShell Cmdlets» (2023).
- Lee Holmes. «Windows PowerShell Cookbook» (3rd edition, O'Reilly Media, 2013).
- Don Jones, Jeffrey Hicks. «Learn Windows PowerShell in a Month of Lunches» (Manning Publications, 2016).
- Bruce Payette. «Windows PowerShell in Action» (3rd edition, Manning Publications, 2017).
- Документация PowerShell Core на GitHub (github.com/PowerShell/PowerShell).
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →