Windows PowerShell - розширюване засіб автоматизації від Microsoft, що складається з оболонки з інтерфейсом командного рядка і супутнього мови сценаріїв. Вперше публічно мову був продемонстрований на Професійної конференції розробників ( англ. Professional Developers Conference , PDC) у вересні 2003 під кодовою назвою Monad. Версія 1.0 випущена в 2006 і зараз доступна для Windows XP з пакетом оновлень 2-3, Windows Server 2003, Windows Vista, і вбудована в Windows Server 2008 як необов'язковий компонент .

Windows PowerShell 2.0 був випущений в складі Windows 7, Windows 8 і Windows Server 2008 R2 як невід'ємний компонент системи. Крім того, друга версія доступна і для інших систем, таких як Windows XP SP3, Windows Server 2003 SP2, Windows Vista SP1 і Windows Server 2008 [1].

Windows PowerShell побудований на базі Microsoft . NET Framework і інтегрований з ним. Додатково PowerShell надає зручний доступ до COM, WMI і ADSI, так само як і дозволяє виконувати звичайні команди командного рядка, щоб створити єдине оточення, в якому адміністратори змогли б виконувати різні завдання на локальних і віддалених системах.

Ці адміністративні завдання зазвичай виконуються за допомогою командлетів (в оригіналі cmdlets ), Які є спеціалізованими класами. NET. Користувач може комбінувати їх у скриптах (сценаріях), використовуючи різні конструкції, утиліти командного рядка і звернення до звичайних класах. NET, об'єктам WMI або COM. Крім того, можна використовувати різні сховища даних, такі як файлова система або реєстр Windows, які надаються 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 тим чи іншим чином [Джерело не вказано 463 дні] .

Windows PowerShell включає свою власну розширювану довідку, доступну (в тому числі з командного рядка) через командлетів Get-Help.


1. Передісторія

Кожна випущена версія MS-DOS і Microsoft Windows для персональних комп'ютерів містила утиліту, яка надає інтерфейс командного рядка. Це були COMMAND.COM COMMAND.COM (в системах, заснованих на MS-DOS, включаючи Windows 9x) і cmd.exe cmd.exe (в системах сімейства Windows NT). Це були звичайні інтерпретатори командного рядка, що мали лише кілька базових команд. Для інших завдань були потрібні окремі консольні додатки, які викликалися з цих оболонок. Вони також мали мову сценаріїв ( пакетні файли), за допомогою якого можна було автоматизувати різні завдання. Однак ці інтерпретатори не годилися для повноцінної автоматизації - частково тому, що в них відсутні еквіваленти багатьох операцій графічного інтерфейсу, а також через слабку функціональності мови сценаріїв, що не дозволяло описувати досить складні алгоритми. В Windows Server 2003 ситуація була покращена, проте підтримка сценаріїв все ще вважалася недостатньою.

Microsoft намагалася вирішити деякі з цих недоліків за допомогою Windows Script Host, що вийшов в 1998 році в складі Windows 98, і утиліти для роботи з ним з командного рядка cscript.exe. Він інтегрується з Active Script і дозволяє писати сценарії на сумісних мовах, таких як JScript і VBScript, використовуючи API, що надається додатками через Component Object Model (COM). Однак у цього рішення свої недоліки. Windows Script Host не інтегрований з оболонкою, відсутня вбудована документація, і він швидко здобув репутацію вектора уразливості [Джерело не вказано 434 дні] після декількох широко розповсюдилися комп'ютерних вірусів, які використали уразливості в його моделі безпеки. Різні версії Windows також надають командні інтерпретатори спеціального призначення (такі як netsh.exe netsh.exe і 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 версії 2.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 версії 2.0 і BITS 4.0 (останній доступний тільки для Windows Vista і Windows 2008; в Windows 7 і Windows Server 2008 R2 він вбудований).


2. Огляд

Команди, що виконуються в Windows PowerShell, можуть бути у формі командлетів, які є спеціалізованими класами . NET, створеними з метою надання функціональності в PowerShell у вигляді сценаріїв PowerShell ( .PS1) або є звичайними виконуваними файлами. Якщо команда є виконуваним файлом, то PowerShell запускає її в окремому процесі; якщо це командлетів, то він виконується всередині процесу PowerShell. PowerShell надає інтерфейс командного рядка, в якому можна вводити команди і відображати виводяться ними дані в текстовому вигляді. Цей користувальницький інтерфейс, базірущійся на стандартному механізмі консолі Windows, надає настроюється механізм автозавершення команд, але не має можливість підсвічування синтаксису, хоча при бажанні її можна забезпечити [2]. У PowerShell також можна створювати псевдоніми ( англ. alias ) Для командлетів, які при виклику перетворюються в оригінальні команди. Крім того, підтримуються позиційні і іменовані параметри для командлетів. При виконанні командлетів робота по прив'язці значень аргументів до параметрів виконується самим PowerShell, але при виклику зовнішніх виконуваних файлів аргументи передаються їм для самостійного розбору.

Інше поняття, використовуване в PowerShell, - це конвеєр ( англ. pipeline ). Подібно конвеєрам в UNIX, вони призначені для об'єднання декількох команд шляхом передачі вихідних даних однієї команди у вхідні дані другої команди, використовуючи оператор |. Але на відміну від аналога в UNIX, конвеєр PowerShell є повністю об'єктним, тобто дані між командлетів передаються у вигляді повноцінних об'єктів відповідних типів, а не як потік байтів. Коли дані передаються як об'єкти, що містяться в них елементи зберігають свою структуру і типи між командлетів, без необхідності використання якої або сериализации або посимвольного розбору даних. Об'єкт також може містити деякі функції, призначені для роботи з даними. Вони також стають доступними для одержуючого їх командлетів. Висновок останнього командлетів в конвеєрі PowerShell автоматично передає на командлетів Write-Host, який створює текстове представлення об'єктів і які у них даних і виводить його на екран.

Так як всі об'єкти PowerShell є об'єктами. NET, вони містять метод .ToString(), який повертає текстове представлення даних об'єкта. PowerShell використовує цей метод для перетворення об'єкту в текст. Крім того, він дозволяє вказати правила форматування, так що текстове представлення об'єктів може бути налаштоване. Однак, з метою підтримки сумісності, якщо в конвеєрі використовується зовнішній виконуваний файл, то він отримує текстовий потік, що представляє об'єкт, і не інтегрується з системою типів PowerShell.

Розширена система типів ( англ. Extended Type System , ETS) PowerShell базується на системі типів. NET, але реалізує деякі доповнення. Наприклад, вона дозволяє створювати різні представлення об'єктів, відображаючи лише деякі з їхніх властивостей і методів, а також застосовувати спеціальне форматування та механізми сортування. Ці уявлення прив'язуються до оригінальних об'єктів за допомогою конфігураційних файлів у форматі XML.


3. Командлети

Командлети ( англ. cmdlets ) - Це спеціалізовані команди PowerShell, які реалізують різну функціональність. Це вбудовані в PowerShell команди. Командлети іменуються за правилом Глагол-Существительное, наприклад Get-ChildItem, завдяки чому їхнє призначення зрозуміло з назви. Командлети виводять результати у вигляді об'єктів або їхніх колекцій. Додатково, командлети можуть отримувати вхідні дані в такій же формі і, відповідно, використовуватися як отримувачі в конвеєрі. Хоча PowerShell дозволяє передавати по конвеєру масиви та інші колекції, командлети завжди обробляють об'єкти по черзі. Для колекції об'єктів обробник командлетів викликається для кожного об'єкта в колекції по черзі.

Екземпляри об'єктів створюються в PowerShell і запускаються їм при виклику. Командлети успадковуються від Cmdlet або від PSCmdlet, причому останній використовується тоді, коли командлетів необхідно взаємодіяти з виконуваною частиною PowerShell ( англ. PowerShell runtime ). У цих базових класах обумовлені деякі методи - BeginProcessing(), ProcessRecord() і EndProcessing(), як мінімум один з яких реалізація командлетів повинна перезаписати для надання своїй функціональності. Кожного разу при запуску командлетів ці методи викликаються PowerShell по черзі. Спочатку викликається BeginProcessing(), потім, якщо командлетів передаються дані по конвеєру, ProcessRecord() для кожного елемента, і в самому кінці - EndProcessing(). Клас, що реалізовує Cmdlet, повинен мати один атрибут. NET - CmdletAttribute, в якому зазначаються дієслово і іменник, складові ім'я командлетів. Популярні дієслова (рекомендується використовувати тільки їх [Джерело не вказано 434 дні] Результати) представлені у вигляді перерахування ( англ. enum ).

Реалізації командлетів можуть викликати будь-які доступні. NET API і можуть бути написані будь-якою мовою. NET. PowerShell також надає деякі додаткові API, такі як WriteObject(), які необхідні для доступу до специфічною для PowerShell функціональності, наприклад для виведення результуючих об'єктів в конвеєр. Командлети можуть використовувати API для доступу до даних безпосередньо або скористатися інфраструктурою постачальників ( англ. provider ) PowerShell, які дозволяють звертатися до сховищ даних через унікальні шляху. Сховища даних представляються через букви дисків та ієрархічну структуру всередині них ( директорії). Windows PowerShell поставляється з постачальниками для файлової системи, реєстру Windows, сховища сертифікатів, а також для псевдонімів команд, змінних і функцій. Інші програми можуть додавати свої командлети і постачальники для доступу до своїх сховищ даних.

У PowerShell 2.0 була додана можливість створення командлетів на самому PowerShell, без використання. NET мов.


3.1. Конвеєр

У PowerShell, як і в оболонках UNIX / Linux, присутній конвеєр. Цей конвеєр служить для передачі вихідних даних одного командлетів у вхідні дані іншого командлетів. Зокрема, користувач може вивести результати командлетів Get-Process в командлетів Sort-Object (наприклад, для сортування процесів за дескрипторах), потім у Where-Object, щоб відфільтрувати процеси, які, наприклад, займають менше 1 МБ сторінкової пам'яті, і в кінці кінців передати результати в командлетів Select-Object, щоб вибрати тільки перші 10 процесів (за кількістю дескрипторів). Концепція конвеєра спочатку використовується в UNIX-подібних системах (див. Конвеєр (UNIX)), концепція PowerShell відрізняється від даного. В UNIX-подібних системах висновок однієї команди передається на наступний етап конвеєра в бінарній формі, тобто являє собою фактично потік даних. Приклад: dd if=/dev/zero bs=1M count=1M | bzip2 -z9 -c > ex.bz2, де потік "нулів" блоками по 1 МБ в кількості 1-го мільйона разів (з пристрою /dev/zero /dev/zero) командою dd dd (копіювання спеціальних файлів) передається на введення команди Bzip2 Bzip2, яка їх стискає максимально можливо (з точки зору алгоритму стиснення bzip2, опція -z9) і результуючий потік передає на stdout (опція ), який в свою чергу перенаправляється в файл ex.bz2. Результатом виконання такої відносно короткою команди стане створення архіву, всередині якого буде потік нульових байтів розміром 1 терабайт. Сам процес створення такого архіву застосовує в даному випадку 2 послідовних конвеєра.

Реалізувати подібну функціональність і гнучкість в Windows засобами самої Windows довгий час було практично неможливим [Джерело не вказано 434 дні] . Закрити даний пролом в середовищах Windows і був фактично покликаний PowerShell, який є якоюсь подобою UNIX shell [Джерело не вказано 434 дні] .


3.2. Сценарії

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. Популярна [Джерело не вказано 434 дні] проблема для багатьох початківців - те, що функції приймають аргументи, поділу не комами, а пробілами (як утиліти командного рядка або командлети):

  1. : Викликає функцію з двома аргументами.

Ці аргументи можуть бути прив'язані до параметрам, зазначеним в оголошенні функції. Також до них можна звернутися через масив $args.

  1. (, ) : Викликає функцію з одним аргументом, який є масивом з двох елементів.

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 можуть бути підписані цифровим підписом для перевірки їх цілісності.


4. 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 2.0 вносить деякі зміни в мову сценаріїв і 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 (собитірованіе). Ця можливість дозволяє слухати, перенаправляти, і виконувати дії при виникненні подій управління або системи. Завдяки собитірованію хости PowerShell можуть бути сповіщені про зміни стану в керованих об'єктах. Також дозволяє сценаріями підписуватися на ObjectEvents, PSEvents і WmiEvents і обробляти їх синхронно та асинхронно.
  • Windows PowerShell Integrated Scripting Environment (ISE). PowerShell 2.0 включає графічну оболонку для мови, в яку входять вбудований відладчик, підсвічування синтаксису, автозавершення команд. Оболонка дозволяє запускати декілька незалежних консолей PowerShell з повною підтримкою Юнікоду в інтерфейсі із закладками. Завдяки підтримці віддаленого виконання деякі консолі можуть виконуватися і на інших комп'ютерах. Крім того, ISE дозволяє виконувати тільки виділені частини сценаріїв, містить вбудований редактор і дозволяє розширювати і доповнювати свій інтерфейс за допомогою PowerShell.
  • BITS Transfer - вбудована підтримка передачі файлів по мережі з пріоритизації, багатопоточність, відновленням і асинхронної роботою на основі технології Background Intelligent Transfer Service.
  • Безліч нових командлетів, включаючи, наприклад, Out-GridView, що дозволяє вивести результати конвеєра в графічну таблицю (на основі WPF), з можливостями сортування та миттєвого пошуку.
  • Нові оператори -Split, -Join та оператор підстановки ( @).
  • Обробка помилок з Try-Catch-Finally. На відміну від інших. NET мов, в PowerShell можна вказувати декілька типів виключень для одного блоку catch.
  • Блокові коментарі. PowerShell 2.0 підтримує блокові коментарі (плюс до вже наявних порядковим #) з використанням <# і #> в якості обмежувачів.
  • Нові API додали різні можливості, від більшого контролю над парсером PowerShell до здатності створювати обмежені сесії ( англ. restricted runspace ), В яких можна виконувати лише обмежений набір інструкцій і команд PowerShell.

5. Порівняння командлетів з аналогічними командами

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

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

Windows PowerShell
(Cmdlet)
Windows PowerShell
(Alias)
cmd.exe / COMMAND.COM
(MS-DOS, Windows, OS / 2, etc.)
Bash
(Unix, BSD, Linux, Mac OS X і т. п.)
Опис
Get-Location gl, pwd cd [3] pwd Відображає поточний робочий каталог
Set-Location sl, cd, chdir cd, chdir cd Змінює поточний каталог
Clear-Host cls, clear cls clear Очищає екран [4]
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, [5] tasklist [6] ps Виводить всі запущені процеси
Stop-Process spps, kill kill, [5] taskkill [6] kill Зупиняє запущений процес
Tee-Object tee n / a tee Передає вхідні дані у файл або змінну, потім передає їх далі по конвеєру

Примітки

  1. Опис Windows Management Framework - support.microsoft.com/kb/968929/ru
  2. Realtime Syntax Highlighting in PowerShell Console "PowerShell і інші скрипти - xaegr.wordpress.com/2008/02/13/realtime-syntax-highlighting-in-powershell-console /
  3. cd без параметрів виводить поточний каталог.
  4. Clear-Host реалізований як зумовлена ​​функція PowerShell.
  5. 1 2 Available in Windows NT4, Windows 98 Resource Kit, Windows 2000 Support Tools
  6. 1 2 Available in Windows XP Professional Edition and later

Література

  • Попов А.В. Введення в Windows PowerShell. - СПб. : БХВ-Петербург, 2009. - С. 464. - ISBN 978-5-9775-0283-2