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.
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
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
$ScriptBlock = { $ps = Get-Process -Name powershell Write-Output -InputObject $ps } & $ScriptBlock
$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
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
New-Alias -Name gtps -Value Get-Process Get-Command -CommandType Alias -Name gtps CommandType Name Version Source ----------- ---- ------- ------ Alias gtps -> Get-Process
Get-Command -CommandType Application -Name calc.exe CommandType Name Version Source ----------- ---- ------- ------ Application calc.exe 10.0.16299.15 C:\Windows\ system32\calc.exe