PowerShell, как и любой серьезный продукт, имеет свою терминологию, знание которой значительно облегчает работу с ним. Бывает так, что при переводе те или иные понятия претерпевают некоторые изменения, в зависимости от правил языка и уже сложившейся терминологической базы, применяемой в определенной области. Кроме того, имеет значение и используемый конкретным изданием стиль изложения технической информации.

Я предлагаю поговорить о терминологии, используемой в PowerShell. Мы не будем рассматривать все существующие в PowerShell обозначения, а сконцентрируемся на терминах, относящихся к типам команд, присутствующих в продукте, не забыв попутно рассмотреть, что же они собой представляют.

PowerShell, помимо своей замечательной способности к интеграции с существующими технологиями —. NET, COM, WMI, поддерживает несколько типов команд, различных по своей природе и происхождению.

Стоит отметить, что одним из основных принципов при создании PowerShell было стремление к едино­образию в отношении именования и использования различных типов команд. Поэтому с определенными оговорками можно сказать, что при обычной работе знание типа той или иной команды не является обязательным. Однако при изучении более сложных механизмов PowerShell это знание точно не будет лишним.

Следует сразу же подчеркнуть, что в тех случаях, когда сущность определенной инструкции в рассматриваемом контексте не является особенно важной, мы будем использовать термин «команда». Если же рассматриваемая тема затрагивает некоторые нюансы, свойственные тому или иному типу инструкции, мы будем применять более точный термин.

Итак, рассмотрим их по порядку.

Команда PowerShell

Это инструкция PowerShell, такая, например, как Get-Process или Get-Item. Ее особенность в том, что написана она с использованием. NET и представлена в системе, чаще всего в качестве одного из компонентов модуля, в виде файла. dll.

В английском языке для ее обозначения используется термин cmdlet (произносится commandlet). Нужно сказать, что зачастую в технических статьях и даже в присутствовавшей в первых двух версиях Windows PowerShell русскоязычной документации используется его транслитерированный вариант — «командлет». Мы же будем использовать более литературный термин — команда PowerShell.

Получить список всех команд PowerShell можно следующим образом:

Get-Command -CommandType Cmdlet

Функция

Функция (Function) — это некая инструкция, написанная на языке PowerShell и представленная в системе в виде файла. ps1 или, если она является частью модуля, psm1.

function Get-Something
{
    Param(
        $Something
    )
    Write-Output -InputObject $Something
}

Стоит отметить, что множество входящих в PowerShell команд также являются функциями. Например, Get-NetIPConfiguration и New-Volume.

Получить список функций, присутствующих в системе, можно при помощи следующей команды:

Get-Command -CommandType Function

cdxml

Отдельным типом является функция, созданная на основе класса WMI и файла. cdxml. По сути, это адаптация некоего класса Windows Management Instrumentation к формату PowerShell.

К примеру, в пространстве имен WMI root/StandardCimv2 присутствует класс MSFT_NetIPAddress, который обладает определенными свойствами и методами. Мы можем обратиться к нему напрямую с использованием команд PowerShell Get-WMIObject или Get-CimInstance.

В PowerShell входит модуль NetTCPIP. Если мы зайдем в его каталог, то среди прочих файлов найдем MSFT_NetIPAddress.cdxml. Заглянув в него, мы обнаружим, что он, по сути, описывает методы взаимодействия с классом WMI MSFT_NetIPAddress и представляет их в виде функций PowerShell (листинг 1).

Фильтр

Фильтр (Filter) — это несколько упрощенный тип функции, предназначенный в первую очередь для обработки поступающих по конвейеру данных (листинг 2).

Блок сценария

Еще одним вариантом функции является блок сценария (ScriptBlock). Он представляет собой некий код, расположенный в фигурных скобках, и, в сущности, является безымянной функцией (листинг 3).

Файл сценария

Отдельным типом команды является файл сценария (Script). Он представляет собой файл *.ps1 и содержит некий исполняемый код.

Отличие файла сценария от файла, содержащего определения функций, состоит в том, что он сам по себе является командой. Таким образом, чтобы выполнить содержащийся в файле сценария код, в консоли PowerShell вы указываете путь к этому файлу и его имя (листинг 4).

Рабочий процесс

Рабочий процесс (Workflow) — это команда, основанная на инфраструктуре Windows Workflow Foundation (WWF) и предназначенная для сред, для которых необходимо использование долгосрочных или выполняющихся параллельно заданий, а также тех, что могут прерываться и возобновляться, например в случаях перезагрузки системы при выполнении задания. Создаваться они могут как с использованием языка PowerShell, так и с помощью XAML (листинг 5).

Стоит отметить, что в PowerShell Core 6.0 рабочие процессы не поддерживаются по причине отсутствия инфраструктуры Windows Workflow Foundation в. NET Core.

Псевдоним

Псевдоним (Alias) не является командой в обычном смысле. В сущности, это альтернативное имя для команды PowerShell, функции, файла сценария или исполняемого файла (листинг 6).

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

Приложение

Приложение (Application) — это некий исполняемый файл, внешний по отношению к PowerShell, такой, например, как calc.exe (листинг 7).

Команда

Как уже говорилось выше, в тех случаях, когда в рамках рассматриваемой темы принадлежность инструкции к тому или иному типу не имеет особенного значения, мы будем использовать термин «команда».

Определенное подтверждение этой концепции, касающейся отношения термина «команда» ко всем остальным (за исключением разве что рабочих процессов), мы можем найти и в описании класса. NET System.Management.Automation.CommandInfo, который является родительским по отношению к классам AliasInfo, ApplicationInfo, CmdletInfo, ExternalScriptInfo, FunctionInfo, RemoteCommandInfo и ScriptInfo.

Листинг 1. Модуль NetTCPIP
Get-Command -CommandType Function -Name *-NetIPAddress

CommandType Name Version Source
----------- ---- ------- ------
Function Get-NetIPAddress 1.0.0.0 NetTCPIP
Function New-NetIPAddress 1.0.0.0 NetTCPIP
Function Remove-NetIPAddress 1.0.0.0 NetTCPIP
Function Set-NetIPAddress 1.0.0.0 NetTCPIP
Листинг 2. Фильтр
filter Get-Value
{
    Write-Output -InputObject $_
}

1,2,3 | Get-Value

Get-Command -CommandType Filter -Name Get-Value

CommandType Name Version Source
----------- ---- -------  ------
Filter Get-Value
Листинг 3. Блок сценария
$ScriptBlock = {
    $ps = Get-Process -Name powershell
    Write-Output -InputObject $ps
}

& $ScriptBlock
Листинг 4. Файл сценария
$Content = @’
    Param(
        [string]$Name       
    )

    Write-Output -InputObject $Name
'@

Set-Content -Path c:\script.ps1 -Value $Content

C:\script.ps1 -Name 'The Name.'

The Name.

Get-Command -CommandType ExternalScript -Name C:\script.ps1

CommandType Name Version Source
----------- ---- ------- ------
ExternalScript script.ps1  C:\script.ps1
Листинг 5. Рабочий процесс
workflow Get-Info
{
    parallel
    {
        Get-Process -Name 'powershell'
        Get-CimInstance -ClassName Win32_ComputerSystem
    }
}
Get-Command -CommandType Workflow -Name Get-Info

CommandType Name Version Source
----------- ---- ------- ------
Workflow Get-Info
Листинг 6. Псевдоним
New-Alias -Name gtps -Value Get-Process
Get-Command -CommandType Alias -Name gtps

CommandType Name Version Source
----------- ---- ------- ------
Alias gtps -> Get-Process
Листинг 7. Приложение
Get-Command -CommandType Application -Name calc.exe

CommandType  Name Version Source
----------- ---- ------- ------
Application calc.exe 10.0.16299.15 C:\Windows\
   system32\calc.exe