PowerShell
Windows PowerShell — это расширяемое средство автоматизации от Microsoft, состоящее из оболочки с интерфейсом командной строки и сопутствующего языка сценариев. Впервые публично язык был продемонстрирован на PDC (Professional Developers Conference), в сентябре 2003 г. под кодовым названием "Monad". Версия 1.0 выпущена в 2006 году и сейчас доступна для Windows XP SP2/SP3, Windows Server 2003, Windows Vista, и встроена в Windows Server 2008 как опциональный компонент.
Windows PowerShell 2.0 был выпущен в составе Windows 7 и Windows Server 2008 R2 как неотъемлемый компонент системы. Кроме того вторая версия доступна и для других систем, таких как: Windows XP SP3, Windows Server 2003 SP2, Windows Vista SP1 и Windows Server 2008.
Windows PowerShell построен на базе Microsoft .NET Framework и интегрирован с ним. Дополнительно PowerShell предоставляет удобный доступ к COM, WMI и ADSI, равно как и позволяет выполнять обычные утилиты командной строки, чтобы создать единое окружение в котором администраторы смогли бы выполнять различные задачи на локальных и удалённых системах.
Эти административные задачи обычно выполняются с помощью командлетов (в оригинале "cmdlets", произносится как "commandlets"), которые являются специализированными классами .Net. Вы можете комбинировать их в скриптах (сценариях) используя различные конструкции, утилиты командной строки, и обращения к обычным классам .NET (или WMI/COM объектам). Кроме того можно использовать различные хранилища данных, такие как файловая система или реестр которые предоставляются PowerShell'у посредством "поставщиков" (в оригинале providers).
Windows PowerShell так же предоставляет механизм встраивания, благодаря которому исполняемые компоненты PowerShell могут быть встроены в другие приложения. Эти приложения затем могут использовать функционал PowerShell для реализации различных операций, включая предоставляемые через графический интерфейс. Этот подход применен в Microsoft Exchange Server 2007 для реализации управляющего функционала в виде командлетов PowerShell, а графических утилит управления в виде оболочек PowerShell которые вызывают необходимые командлеты. Таким образом графический интерфейс управления находится поверх промежуточного слоя - PowerShell. Другие приложения Microsoft, включая Microsoft SQL Server 2008, System Center Operations Manager и System Center Data Protection Manager так же предоставляют доступ к своим интерфейсам управления через командлеты PowerShell. В будущем все серверные приложения Microsoft на платформе Windows будут использовать PowerShell тем или иным образом.
Windows PowerShell включает свою собственную, расширяемую, доступную из командной строки справку, доступную через командлет Get-Help.
Предыстория
Каждая выпущенная версия Microsoft DOS и Microsoft Windows для персональных компьютеров, включала утилиту предоставляющую интерфейс командной строки. Это были COMMAND.COM
(в системах основаных на MS_DOS, включая Windows 9x и cmd.exe
(в системах семейства Windows NT). Это были обычные интерпретаторы командной строки, которые включали лишь несколько базовых команд. Для других задач требовались отдельные консольные приложения, которые вызывались из этих оболочек. Они так же включали язык сценариев (командные файлы), которые можно было использовать для автоматизации различных задач. Однако, они не годятся для автоматизации всех граней функционала графического интерфейса. Частично потому что отсутствуют эквиваленты многих операций доступных в графическом интерфейсе, и потому что язык сценариев слишком малофункционален и не позволяет создавать сложные сценарии объединяя доступный функционал. В Windows Server 2003, ситуация была улучшена , однако поддержка сценариев всё еще считалась недостаточной.
Microsoft пыталась решить некоторые из этих недостатков с помощью Windows Script Host в 1998 году, в составе Windows 98, и утилиты для работы с ним из командной строки: cscript.exe
. Он интегрируется с Active Script и позволяет писать сценарии на совместимых языках, таких как JScript и VBScript, используя API предоставляемое приложениями через COM. Однако у этого решения свои недочеты. WSH не интегрирован с оболочкой, отсутствует встроенная документация, и оно быстро получило репутацию вектора уязвимости после нескольких, широко распространившихся компьютерных вирусов использующих уязвимости в его модели безопасности. Различные версии Windows так же предоставляют командные интерпретаторы специального назначения (такие как netsh и WMIC со своими собственными наборами команд. Они не интегрированы с командной оболочкой, и не дают возможностей для взаимодействия.
В 2003 Microsoft начала разработку новой оболочки, называемой Monad (так же известной как Microsoft Shell или MSH). Monad должен быть стать новой расширяемой оболочкой командой строки, со свежим дизайном, который позволял бы автоматизировать весь спектр административных задач. Microsoft опубликовала первую публичную бета-версию Monad 17 июня 2005 г. Вторая и третья бета-версии были выпущены 11 сентября 2005, и 10 января 2006 соответственно. 25 апрея 2006 года было объявлено о том что Monad переименован в Windows PowerShell, для позиционирования его в качестве значительной части их технологий управления. В это же время была выпущена версия Release Candidate 1. Release Candidate 2 последовал 26 сентября 2006 г. Финальная версия (Release to Web, RTW) была выпущена 14 ноября 2006 года для Windows XP SP2 и Windows 2003. Финальная версия для Windows Vista стала доступна только 30 января 2007 г. Последний CTP релиз Windows PowerShell v2.0 был выпущен в декабре 2008 г. Финальная версия второй версии PowerShell была выпущена в составе систем Windows 7 и Windows Server 2008 R2 одновременно с их выпуском. Для остальных систем (Windows XP, Windows Server 2003, Windows Vista, Windows 2008), вторая версия PowerShell стала доступна в составе(комплекте) Windows Management Framework 27 октября 2009 г. Кроме Windows PowerShell второй версии, в этот комплект так же входят WinRM v2.0 и BITS 4.0 (последний доступен только для Windows Vista и Windows 2008. В Windows 7 и Windows Server 2008 R2 он встроен).
Обзор
Команды, исполняемые в Windows PowerShell, могут быть в форме командлетов, которые являются специализированными классами .NET созданными с целью предоставления функционала в PowerShell, в виде сценариев PowerShell (*.ps1) или являться обычными исполняемыми файлами. Если команда является исполняемым файлом, то PowerShell запускает её в отдельном процессе; если это командлет, то он исполняется внутри процесса PowerShell. PowerShell предоставляет интерфейс командной строки, в котором можно вводить команды и отображать выводимые ими данные в текстовом виде. Этот пользовательский интерфейс, базирущийся на стандартном механизме консоли Windows, предоставляет настраиваемый механизм автозавершения команд, но не обладает возможностью подсветки синтаксиса (хотя при желании [1]). В PowerShell также можно создавать псевдонимы (alias) для командлетов, которые при вызове преобразуются в оригинальные команды. Кроме того поддерживается позиционные и именованные параметры для командлетов. При выполнении командлета, работа по привязке значений аргументов к параметрам выполняется самим PowerShell, но при вызове внешних исполняемых файлов, аргументы передаются им для самостоятельного разбора.
Другое понятие используемое в PowerShell - это "конвейер" (pipeline). Подобно конвейерам в Unix, они предназначены для объединения нескольких команд, передавая выходные данные одной команды во входные данные второй команды, используя оператор |
. Но в отличии от аналога в Unix, конвейер PowerShell является полностью объектным. То есть, данные между командлетами передаются в виде полноценных объектов соответствующих типов, а не как поток байтов. Когда данные передаются как объекты, содержащиеся в них элементы сохраняют свою структуру и типы между командлетами, без необходимости использования какой либо сериализации или посимвольного разбора (parsing) данных, как в случаях когда доступны лишь байтовые потоки. Объект также может содержать некоторые функции предназначенные для работы с данными. Они так же становятся доступными для получающего их командлета. Вывод последнего командлета в конвеере, PowerShell автоматически передаёт на командлет Write-Host
, который создаёт текстовое представление объектов и содержащихся в них данных, и выводит его на экран.
Так как все объекты PowerShell являются объектами .NET, они содержат метод .ToString()
возвращающий текстовое представление данных объекта. PowerShell использует этот метод для преобразования объекта в текст. Кроме того, он позволяет указать правила форматирования, так что текстовое представление объектов может быть настроено. Однако, с целью поддержания совместимости, если в конвейере используется внешний исполняемый файл, то он получает текстовый поток представляющий объект, и не интегрируется с системой типов PowerShell.
Расширяемая система типов (Extended Type System, ETS) PowerShell базируется на системе типов .NET, но реализует некоторые дополнения. Например, она позволяет создавать различные представления объектов, отображая лишь некоторые из их свойств и методов, а так же применять специальное форматирование и механизмы сортировки. Эти представления привязываются к оригинальным объектам с помощью конфигурационных файлов в формате XML.
Командлеты
Командлеты (Cmdlets) это специализированные PowerShell команды которые реализуют различный функционал. Это родные для PowerShell'а команды. Командлеты именуются по правилу Глагол-Существительное (Verb-Noun), например Get-ChildItem, благодаря чему их предназначение понятно из названия. Командлеты выводят результаты в виде объектов, или их коллекций. Опционально командлеты могут получать входные данные, в такой же форме, и соответственно использоваться как получатели в конвейере. Хотя PowerShell позволяет передавать по конвейеру массивы и другие коллекции, командлеты всегда обрабатывают объекты поочередно. Для коллекции объектов, обрбаботчик командлета вызывается для каждого объекта в коллекции по очереди.
Командлеты это специализированные классы .NET, экземпляры которых создаются в PowerShell, и запускаются им при вызове. Командлеты наследуются от Cmdlet
или от PSCmdlet
, причем последний используется тогда когда командлету необходимо взаимодействовать с исполняемой частью PowerShell (PowerShell runtime). В этих базовых классах оговорены некоторые методы - BeginProcessing()
, ProcessRecord()
и EndProcessing()
, как минимум один из которых реализация командлета должна перезаписать для предоставления своего функционала. Каждый раз, при запуске командлета, эти методы вызываются PowerShell'ом по очереди. Сначала BeginProcessing()
, затем, если командлету передаются данные по конвейеру, вызывается ProcessRecord()
для каждого элемента, и в самом конце вызывается EndProcessing()
. Класс реализующий Cmdlet должен иметь один аттрибут .NET - CmdletAttribute
в котором указываются глагол (Verb) и существительное (Noun) составляющие имя командлета. Популярные глаголы (рекомендуется использовать только их) (Нужна ссылка на Approved verb list) представлены в виде перечисления (Enum).
Реализации командлетов могут вызывать любые доступные .NET API и могут быть написаны на любом языке .NET. PowerShell также предоставляет некоторые дополнительные API, такие как WriteObject()
, которые необходимы для доступа к спецефичному для PowerShell функционалу, например для вывода результирующих объектов в конвейер. Командеты могут использовать API для доступа к данным напрямую, или воспользоваться инфраструктурой поставщиков (Provider) PowerShell, которые позволяют обращаться к хранилищам данных через уникальные пути. Хранилища данных представляются через буквы дисков и иерархическую структуру внутри них (директории). Windows PowerShell поставляется с поставщиками для файловой системы, реестра Windows, хранилища сертификатов, а так же для псевдонимов команд (alias:), переменных (variable:) и функций (functions:). Другие приложения тоже могут добавлять свои командлеты и поставщики для доступа к своим хранилищам данных.
В PowerShell V2 была добавлена возможность создания командлетов на самом PowerShell, без использования .NET языков.
Конвейер
В PowerShell, как и в оболочках Unix/Linux, присутствует конвейер. Этот конвейер служит для передачи выходных данных одного командлета во входные данные другого командлета. В частности, вы можете вывести результаты командлета Get-Process в командлет Sort-Object (например для сортировки процессов по Handles) и затем в Where-Object чтобы отфильтровать процессы которые скажем занимают меньше 1mb paged memory, и в конце концов передать результаты в командлет Select-Object чтобы выбрать только первые 10 процессов (по количеству handle'ов).
Хотя концепция конвейера давно используется в Unix/Linux системах, PowerShell отличается от них в том что передается между этапами конвейера. В Unix, вывод одной команды передается на следующий этап конвейера как обычный текст. В PowerShell конвейер состоит из настоящих объектов .NET. Это даёт сразу два преимущества: во-первых убирает необходимость делать "prayer-based parsing" - то есть разбирать текстовый вывод команды в надежде что с новой версией не изменилось его форматирование. Во-вторых, такой подход приводит к более простым, и следовательно более читабельным сценариям, что в свою очередь уменьшает стоимость и сложность их дальнейшей поддержки.
Сценарии
PowerShell включает язык сценариев с динамическими типами, на котором можно реализовывать сложные операции с использованием командлетов. Язык сценариев поддерживает переменные, функции, конструкции ветвления (if-then-else
) циклы (while
,do
,for
и foreach
), структурированную обработку ошибок, и множество других возможностей включая интеграцию с .NET. Переменные в PowerShell обозначаются префиксом $
перед именем; им может быть присвоено любое значение, включая вывод командлетов. Хотя сам язык не строго типизирован, внутри, переменные сохраняются с их типами, которые могут быть базовыми типами (primitive types) или объектами. Строки могут быть заключены в одиночные кавычки или в двойные кавычки: при использовании двойных кавычек, переменные содержащиеся в строке, будут заменены их значениями. В соответствии с синтаксисом переменных, если путь к файлу помещен в фигурные скобки с предшествующим знаком доллара (то есть $C:\foo.txt
), то это будет ссылкой на содержимое файла. Всё что будет назначено такой переменной, будет записано в файл, и наоборот - при обращении к её содержимому, будет выдано содержимое файла.
К свойствам и методам объекта можно обращаться используя .
, как в синтаксисе C#. PowerShell предоставляет специальные переменные, такие как $args
содержащая массив всех аргументов командной строки переданных функции, или $_
ссылающаяся на текущий объект в конвейере и других конструкциях. В PowerShell также присутствуют массивы, и ассоциативные массивы. Кроме того, PowerShell автоматически вычисляет арифметические выражения введенные в командной строке, и понимает популярные аббриевиатуры, такие как GB, MB и KB.
В PowerShell можно создавать собственные функции принимающие параметры с помощью ключевого слова function
. Популярная проблема для многих начинающих, это то что функции принимают аргументы разделенные не запятыми, а пробелами (как утилиты командной строки или командлеты):
<function> <param1> <param2>
: Вызывает функцию с двумя аргументами. (Эти аргументы могут быть привязаны к параметрам указанным в объявлении функции. Также к ним можно обратиться через массив $args.<function>(<param1>, <param2>)
: Вызывает функцию с одним аргументом, которы является массивом из двух элементов.
PowerShell позволяет вызывать любые методы .NET, заключив их пространство имён в квадратные скобки ([]
), и затем используя пару двоеточий (::
) для указания статического метода. Например [System.Console]::WriteLine("PowerShell")
. Объекты создаются с помощью командлета New-Object
, добавлять к ним новые свойства можно используя командлет Add-Member
.
Для обработки ошибок PowerShell предоставляет механизм основанный на .NET. В случае ошибки, выдаются объекты содержащие информацию об ошибке (объект Exception
), которые перехватываются ключевым словом trap
. Однако поведение при возникновении ошибок настраиваемое. Так можно настроить PowerShell чтобы в случае ошибки он молча продолжал выполнение без перехвата ошибки. Во второй версии PowerShell так же была добавлена конструкция Try Catch Finally.
Сценарии написанные в PowerShell можно сохранять между сессиями в файлах .ps1
. Затем можно использовать весь сценарий или индивидуальные функции из него. Сценарии и функции используются подобно командлетам. То есть они могут быть командами в конвейере, им можно передавать параметры. Объекты могут прозрачно передаваться между сценариями, функциями и командлетами в конвейере. Однако выполнение сценариев PowerShell по умолчанию запрещено, и его надо включить с помощью командлета Set-ExecutionPolicy
. Сценарии PowerShell могут быть подписаны цифровой подписью для проверки их целостности.
PowerShell 2.0
Microsoft выпустила PowerShell 2.0 в составе Windows 7 и Windows Server 2008 R2. Windows PowerShell 2.0 предустановлен в этих системах. Исключением является режим установки Windows Server 2008 R2 в режиме Core, где PowerShell 2.0 можно доустановить вручную. Для более старых платформ, он доступен в составе Windows Management Framework. PowerShell V2 вносит некоторые изменения в язык сценариев и API для встраивания, в дополнение к новым 240 командлетам. Не полный список новых возможностей включенных в PowerShell 2.0:
- PowerShell Remoting: Используя WS-Management PowerShell 2.0 позволяет вызывать сценарии и командлеты на удаленных машинах (в том числе и на нескольких одновременно), отслеживать состояние их выполнения, и получать результаты в виде объектов (через сериализацию-десереализацию). Так же возможно устанавливать интерактивные сессии, и сессии с ограниченным функционалом.
- Фоновые работы Возможность вызывать последовательности команд асинхронно. Работы можно запускать на локальной машине, или на нескольких удалённых машинах. Работы не могут использовать интерактивные командлеты.
- Транзакции Позволяют разработчикам командлетов и поставщиков реализовывать транзакционные операции. PowerShell 2.0 включает командлеты для инициализации, подтверждения и отката транзакций, и возможности для управления транзакциями и использования их в командлетах и поставщиках.
- Advanced Functions Возможность разрабатывать полноценные командлеты используя только сам PowerShell.
- SteppablePipelines Позволяет пользователю контролировать вызов функций
BeginProcessing()
,ProcessRecord()
иEndProcessing()
при вызове командлета. - Модули Позволяет авторам сценариев и администраторам организовывать сценарии PowerShell и помещать их в самодостаточные модули. Код из модуля, выполняется в своем собственном, независимом контексте, и не влияет на окружение вне модуля. Используя сценарий модули могут объявлять ограниченное окружение. Модули могут содержать публичные и приватные функции и переменные.
- Язык данных Подмножество языка PowerShell которое позволяет отделять определения данных, от исполняемого кода сценариев, и даёт возможность импортировать в сценарий локализованные строки в процессе выполнения.
- Отладка сценариев Возможность устанавливать точки прерывания (breakpoints) в сценариях или функциях PowerShell. Точки прерывания могут быть установлены на строки, столбцы, команды, или операции чтения и/или записи переменных. Присутствуют командлеты для установки и контроля точек прерывания в сценариях.
- Eventing Эта возможность позволяет слушать, перенаправлять, и выполнять действия при возникновении событий управления или системы. Благодаря Eventing, хосты PowerShell могут быть оповещены о изменениях состояния в управляемых объектах. Также позволяет сценариям подписываться на ObjectEvents, PSEvents и WmiEvents и обрабатывать их синхронно и асинхронно.
- Windows PowerShell Integrated Scripting Environment (ISE): PowerShell 2.0 включает графическую оболочку для языка в которую входят: встроенный отладчик, подсветка синтаксиса, автозавершение команд и которая позволяет запускать несколько независимых консолей PowerShell с полной поддержкой Unicode в интерфейсе с закладками. Благодаря Remoting некоторые консоли могут выполняться и на других компьютерах. Кроме того ISE позволяет выполнять только выделенные части сценариев, включает встроенный редактор, и позволяет расширять и дополнять свой интерфейс с помощью PowerShell.
- BITS Transfer родная поддержка передачи файлов по сети с приоретизацией, многопоточностью, возобновлением, и асинхронной работой на основе технологии Background Intelligent Transfer Service.
- Множество новых командлетов включая, например, Out-GridView, позволяющий вывести результаты конвейера в графическую таблицу (на основе WPF), с возможностями сортировки и мгновенного поиска.
- Новые операторы
-Split
,-Join
и оператор подстановки (Splatting) (@
). - Обработка ошибок с Try-Catch-Finally В отличие от других .NET языков, в PowerShell можно указывать несколько типов исключений (Exception) для одного блока catch.
- Блочные комментарии PowerShell 2.0 поддерживает блочные комментарии с использованием
<#
и#>
в качестве ограничителей. - Новые API Новые API добавили разные возможности, от большего контроля над парсером PowerShell до способности создавать ограниченные сессии (Restricted Runspace) в которых можно выполнять лишь ограниченный набор инструкций и команд PowerShell.
Сравнение командлетов с аналогичными командами
В следующей таблице содержится выборка командлетов поставляющихся с PowerShell, с приведением максимально похожих команд из других широко известных оболочек командной строки.
Windows PowerShell (Cmdlet) |
Windows PowerShell (Alias) |
cmd.exe / COMMAND.COM (MS-DOS, Windows, OS/2, etc.) |
Bash (Unix, BSD, Linux, Mac OS X и т.п.) |
Description |
---|---|---|---|---|
Get-Location | gl, pwd | cd | pwd | Отображает текущий рабочий каталог. |
Set-Location | sl, cd, chdir | cd, chdir | cd | Меняет текущий каталог |
Clear-Host | cls, clear | cls | clear | Очищает экран [2] |
Copy-Item | cpi, copy, cp | copy | cp | Копирует один или несколько файлов иди дерево директорий (в PowerShell также может копировать объекты других поставщиков данных) |
Get-Help | help, man | help | man | Справка по командам |
Remove-Item | ri, del, erase, rmdir, rd, rm | del, erase, rmdir, rd | rm, rmdir | Удаляет файл/каталог (или другой элемент в поставщиках данных PowerShell). |
Rename-Item | rni, ren | ren, rename | mv | Переименовывает файл/каталог |
Move-Item | mi, move, mv | move | mv | Перемещает файл/каталог в новое местоположение |
Get-ChildItem | gci, dir, ls | dir | ls | Выводит все файлы/каталоги в текущем каталоге |
Write-Output | echo, write | echo | echo | Выводит строки, переменные на стандартный вывод |
Pop-Location | popd | popd | popd | Изменяет текущий каталог на тот который был последним помещён в стек |
Push-Location | pushd | pushd | pushd | Помещает текущий каталог в стек |
Set-Variable | sv, set | set | set | Установка значения переменной/создание переменной |
Get-Content | gc, type, cat | type | cat | Получает содержимое файла |
Select-String | find, findstr | grep | Выводит строки подходящие под условие | |
Get-Process | gps, ps | tlist,[3] tasklist[4] | ps | Выводит все запущенные процессы |
Stop-Process | spps, kill | kill,[3] taskkill[4] | kill | Останавливает запущенный процесс |
Tee-Object | tee | n/a | tee | Передаёт входные данные в файл или переменную, затем передаёт их дальше по конвейеру |
Оболочки
- powershell.exe
- PowerShell ISE
- PowerShell Plus
- Posh Console
- PowerShellFar
См. также
Примечания
Ссылки
- Windows Manament Framework (включающий PowerShell 2.0, WinRM 2.0 и BITS 4.0) для Windows XP, Windows Server 2003, Windows Vista, Windows Server 2008
- «Блог Бешкова Андрея из Microsoft, о Powershell» (рус.)
- Бесплатная русская книга о PowerShell (рус.)
- Бесплатная английская книга о PowerShell (англ.)
- Вторая бесплатная английская книга о PowerShell (англ.)
- Веб-узел Windows PowerShell (англ.)
- Блог «PowerShell и другие скрипты» (рус.)
- PwrShell.net (англ.)
- PowerShell: первые шаги. Заметка на OpenQuality.ru (рус.)
- Виртуальная лаборатория "Creating Windows PowerShell Script Cmdlets"
- PowerShell Help Reader - pасширяемый MSDN-подобный справочник для PowerShell (англ.)
- PowerShell 2.0 RTM доступен для всех версий Windows
int main()
{
printf("Hi");
return 0;
}
| Это заготовка статьи о программировании. Помогите Википедии, дополнив её. |