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

Командлеты

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

По области применения

Устройство и характеристики

Каждый командлет представляет собой экземпляр класса, производного от 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.

Примеры

Ниже приведены типичные примеры использования командлетов:

  1. Получение списка всех запущенных процессов, использующих более 100 МБ памяти:

``powershell Get-Process | Where-Object {$_.WorkingSet -gt 100MB} ``

  1. Создание новой папки в текущем каталоге:

``powershell New-Item -Path ".\NewFolder" -ItemType Directory ``

  1. Остановка службы с именем «Spooler»:

``powershell Stop-Service -Name Spooler ``

  1. Получение справки по командлету Get-ChildItem:

``powershell Get-Help Get-ChildItem -Detailed ``

  1. Экспорт списка всех установленных программ в 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 →