Частина 1. Знайомимося з PowerShell (Командний рядок та автоматизація роботи)

24 липня 2023 4 хвилин Автор: Lady Liberty

PowerShell: Керуй Windows з майстерністю

PowerShell є потужним інструментом для керування операційною системою Windows і автоматизації різних завдань. Це інтерактивна командна оболонка і мова сценаріїв, створена спеціально для адміністрування Windows-платформи. У нашому посібнику про PowerShell, ми представимо вам основи використання цього інструмента і розкриємо його можливості. Ви дізнаєтесь, як працювати з командним рядком PowerShell, виконувати різні операції з файлами і каталогами, керувати службами та процесами, а також налаштовувати системні параметри. Одна з головних переваг PowerShell – це його здатність до автоматизації завдань. Ви дізнаєтесь, як створювати і виконувати сценарії, що дозволяє зберегти час та зусилля під час виконання рутинних дій адміністрування.

Посібник буде корисний як для початківців, що тільки знайомляться з PowerShell, так і для досвідчених адміністраторів, які бажають поглибити свої знання та оптимізувати робочий процес. Приготуйтеся дізнатися про можливості PowerShell та його потенціал для автоматизації роботи в операційній системі Windows. В доповнення до основних функцій PowerShell, наш посібник також розкриє інтерактивний режим, де ви зможете експериментувати з командами та перевіряти результати безпосередньо у командному рядку. Покрокові приклади та практичні завдання допоможуть вам швидше освоїти PowerShell і застосовувати його в реальних сценаріях. Ми також покажемо, як працювати зі змінними, вводити цикли та умовні конструкції, що розширить ваші можливості при написанні скриптів. Окрім цього, ви дізнаєтесь про інтеграцію PowerShell з іншими інструментами та сервісами, такими як Azure, Office 365, Active Directory тощо. Це відкриє нові горизонти для автоматизації управління в різних середовищах. Завдяки нашому посібнику, ви зможете оптимізувати робочий процес, підвищити продуктивність та забезпечити більш ефективне керування вашою системою Windows. Незалежно від вашого досвіду з PowerShell, цей посібник стане цінним ресурсом для розвитку ваших навичок та досягнення високої ефективності в роботі з цим потужним інструментом.

Командний рядок і автоматизація роботи

Для зв’язку з комп’ютером, ноутбуком або мобільним пристроєм необхідний посередник – операційна система. Будь-яку операційну систему можна представити як набір ядра системи, який управляє апаратною частиною і оперує файлами і процесами, так і інтерфейсу, що надає користувачеві доступ до функціоналу ядра.

Інтерфейс може бути різних типів

  • Command-text, коли команди для управління системою вводяться з клавіатури або беруться з заздалегідь підготовлених текстових файлів скриптів (скриптів). У ранніх операційних системах командний інтерфейс був єдиним.

  • Графічний, коли ви працюєте в системі через різні візуальні елементи управління (кнопки, списки, що випадають, діалогові вікна тощо). Графічний інтерфейс є основним засобом взаємодії користувачів на сучасних персональних комп’ютерах і мобільних пристроях.

  • Голос, коли людина просто вимовляє команди для управління системою. Останнім часом широкого поширення набули кілька систем такого типу (Apple Siri, Microsoft Cortana, Google Now), які працюють на різних мобільних платформах. Популярність цих голосових помічників зростає, розвиваються технології розпізнавання голосу, але говорити про те, що в найближчому майбутньому голосове управління повністю замінить графічний і текстовий інтерфейси, поки не представляється можливим.

Звичайно користувачеві простіше та зручніше сьогодні розібратися з графічним інтерфейсом, немає необхідності вчити і запам’ятовувати спеціальні команди. Чому навіть в найсучасніших операційних системах для персональних комп’ютерів і серверів командно-текстовий інтерфейс продовжує підтримуватися у вигляді оболонок командного рядка і різних середовищ виконання програм на спеціальних мовах сценаріїв (скриптових мовах)?

Навіщо потрібна командний рядок і скрипти?

Справа в тому, що графічний інтерфейс погано підходить для автоматизації роботи, коли один раз виконані дії потрібно відтворювати знову і знову. Така автоматизація може знадобитися, якщо ми регулярно виконуємо однотипні операції (наприклад, копіюємо змінені за день документи або, навпаки, нам потрібно виконати одну операцію, але на багатьох комп’ютерах мережі (наприклад, змінити шлях до файлу в ярлику на робочих столах сотень комп’ютерів).

Якщо такі дії виконувалися за допомогою текстових команд, то їх можна легко повторити без участі людини, створивши з цими командами пакетний файл (скрипт). Це значно підвищує продуктивність роботи з рутинними завданнями.

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

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

Нарешті, скрипти дозволяють автоматично використовувати служби, що надаються внутрішніми об’єктами операційної системи та іншим програмним забезпеченням (наприклад, офісними додатками).

Вивчення скриптових мов для операційної системи може бути корисним для різних людей:

Про сервері, базі даних або локальних мережах адміністраторам просто необхідно володіти навичками створення і використання скриптів, без цього їх робота буде дуже неефективною;

Для звичайного користувача скрипти є корисним додатковим інструментом для автоматизації повсякденних дій: маніпулювання файлами, робота з офісними додатками та інтернет-ресурсами;

Розробники додатків  можуть використовувати скрипти для компіляції і запуску написаних програм, виконання HTTP-запитів, роботи з командним інтерфейсом системи контролю версій Git, менеджерів пакетів різних мов програмування (наприклад, PRT для JavaScript або Composer для PHP) або консольних утиліт, таких як wget, curl.

Особливості скриптових мов для операційної системи

Мови командних скриптів є одним з типів широкого спектру мов сценаріїв. Основне завдання таких мов – «припустити» готові компоненти, наявні в операційній системі (виконувані файли, динамічні бібліотеки, внутрішні системні об’єкти і т. Д.), Зв’язавши їх між собою. Цим скриптові мови відрізняються від традиційних «системних» мов програмування (C, C++, Java і т.д.), які розроблялися з розрахунком на побудову структур даних і алгоритмів.

Якою б ви хотіли бачити ідеальну командну оболонку і скриптову мову для автоматизації роботи в операційній системі?

Перерахуємо деякі вимоги, що пред’являються до таких інструментів

  • Сумісність з усіма версіями операційної системи, що використовуються в даний час, і доступ до максимально широкого спектру функцій операційної системи.

  • Простота і зрозумілість мови – він повинен бути доступний звичайним користувачам, а не тільки професійним програмістам.

  • Можливість запускати зовнішні виконувані файли зі сценарію в командному режимі без використання додаткових конструкцій.

  • Підтримка як пакетного режиму (написання і запуск скриптів), так і зручного інтерактивного командного рядка (з короткими псевдонімами для команд, автодоповненням команд і шляхами до файлів і каталогів, можливістю повторення раніше введених команд і т.д.).

  • Вбудована довідкова система та централізоване сховище скриптів для вирішення поширених завдань.

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

Перефразовуючи знаменитий вислів Карла Маркса про буття, що визначає свідомість, можна сказати, що операційна система визначає свою оболонку. Командні мови і оболонки створювалися не на порожньому місці, вони розвивалися разом з операційними системами. У системі з’явилися нові можливості – потрібен інструмент для доступу до цих функцій в автоматичному режимі. В результаті ви створюєте командно-скриптову мову програмування і середовище виконання команд і скриптів на цій мові, які, природно, підходять для конкретної операційної системи.

Майже всі сучасні комп’ютери, ноутбуки та сервери працюють або під управлінням  Windows, або однієї з операційних систем (macOS або Linux).  Зовні операційні системи цих двох сімейств можуть бути більш-менш схожі між собою (наприклад, графічний інтерфейс Linux Mint нагадує Windows 7). Однак внутрішня структура Windows і UNIX має принципову архітектурну відмінність, яке визначило різні способи розробки командних оболонок і скриптових мов для цих операційних систем і в кінцевому підсумку привели до створення дійсно унікального і потужного засобу автоматизації – Microsoft PowerShell.

Засоби автоматизації в IMC-подібних системах

В  операційних системах (macOS або Linux) в якості стандартного засобу автоматизації використовується термінал, в якому запускаються команди і скрипти тієї чи іншої модифікації оригінальної командної оболонки UNIX (найчастіше bash або zsh).

Саме в UNIX в далеких 1970-х роках зародилися і розвивалися принципи програмування, засновані на інструментальних засобах (software tools).

  • Для вирішення певного завдання розробляються невеликі утиліти, кожна з яких яких виконує одну функцію розв’язуваної задачі.

  • Поставлене завдання вирішується шляхом взаємодії утиліт (команд) за рахунок послідовної обробки даних кожної їх.

  • При розробці цих утиліт орієнтуються на їх максимально незалежне використання, що дозволяє застосовувати їх для вирішення інших завдань. Таким чином, поступово створюються інструментальні засоби для подальшого універсального застосування.

  • Більшість утиліт є фільтрами, які читають вхідну інформацію зі стандартного потоку STDIN (за умовчанням це клавіатура), обробляють її та передають результат у вигляді потоку тексту через стандартний потік STDOUT на інший пристрій (за замовчуванням – на екран).

  •  Утиліти-команди з’єднуються один з одним у сценаріях операційної системи за допомогою перенаправлення вводу/виводу та створення програмних конвеєрів (напрямок вихідного потоку однієї програми на вхід іншої)

Різні  системні параметри, налаштування та конфігурації програм зберігаються у звичайних текстових файлах. Взагалі, в світі UNIX текстові дані зазвичай використовуються в якості універсального представлення інформації (крім, звичайно, виконуваних файлів в машинному коді, зашифрованих файлів і архівів, графічних або мультимедійних файлів). Тому  існує безліч потужних стандартних утиліт обробки текстів (grep, sed, awk, sort  і т.д.).

Ще один основний принцип UNIX виражається фразою «все є файл». У вигляді файлів (віртуальних) представлені канали зв’язку програм між собою, периферійні пристрої і віртуальні пристрої, що емулюють ядро операційної системи. Наприклад, щоб дізнатися параметри процесора на комп’ютері з Linux, досить роздрукувати вміст віртуального файлу cpuinfo в каталозі /proc за допомогою команди cat:

cat /proc/cpuinfo
processor
vendor id
0
Genuinelntel
cpu family
model
6
58
20 Часть I. Знакомимся с PowerShell
cache_alignment : 64
model name
stepping
microcode
cpu MHz 
cache size
physical id
siblings
core id
: Intel(R) Core(TM) i7-3770S CPU @ 3.10GHz
: 9
: Oxffffffff
: 3092.986
: 8192 KB
: 0
: 8
: 0
cpu cores
apicid
initial apicid
fpu
fpu exception
cpuid level
wp
flags
: 4
: 0
: 0
: yes
: yes
: 13
: yes
: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov
pat pse36 ciflush mmx fxsr sse sse2 ss ht syscall nx rdtscp
lm constant tsc rep good nopl xtopology cpuid pni pclmulqdq
ssse3 cxl6 pcid sse4 1 sse4 2 popcnt xsave avx fl6c rdrand
hypervisor lahf lm pti ssbd ibrs ibpb stibp fsgsbase smep
erms xsaveopt flush lid arch capabilities
bugs : cpu meltdown spectre vl spectre v2 spec store bypass lltf mds
swapgs itlb multihit srbds
bogomips
ciflush size
: 6185.97
: 64
power management:
address sizes : 36 bits physical, 48 bits virtual

Таким чином, прості завдання автоматизації  в  системах в кінцевому підсумку зводяться до роботи з файловою системою і обробки текстів. Такі завдання зручно вирішувати, послідовно застосовуючи кілька команд, об’єднаних текстовими потоками в конвеєр (мал. 1).

Мал. 1.1. Перетворення текстових даних у конвеєрі команд

У більш складних випадках, коли пари конвеєрів недостатньо, скриптові програми пишуться на підтримуваному оболонкою командно-скриптовому мові (ці мови родом з 1970-х років, їх не можна назвати зручними або інтуїтивно зрозумілими) або на одному з універсальних інтерпретованих мов, найпопулярнішим з яких зараз є Python.

Особливості автоматизації в Windows

Microsoft Windows, яка вже кілька десятиліть є найпоширенішою операційною системою для персональних комп’ютерів і ноутбуків, має кілька стандартних засобів автоматизації, які сильно відрізняються. Спробуємо розібратися в цьому різноманітті, розібратися в причинах появи цих інструментів і в кінцевому підсумку вирішимо, які засоби автоматизації підходять саме нам.

Почнемо з того, що Windows, на відміну від UNIX, має API-орієнтовану архітектуру: операційна система складається з величезної кількості підсистем і компонентів, доступ до яких здійснюється через певний API (Application Program Interface, інтерфейс прикладного програмування), тобто для управління ними потрібні спеціальні додатки. Для спрощення роботи з такою складною системою керовані елементи групуються в структуровані об’єкти.

У цьому полягає принципова відмінність Windows  від  систем, які орієнтовані на використання тексту для представлення всього, що можливо.  Хоча ви можете адмініструвати, просто працюючи з текстовими файлами конфігурації, Windows повинна використовувати різноманітні API, отримуючи доступ до властивостей і методів багатьох внутрішніх об’єктних моделей Windows (.NET Framework, WMl, WSH, ADSl, CDO тощо).

Таким чином, для ефективної автоматизації роботи в Windows недостатньо просто освоїти інструменти роботи з файловою системою і обробки текстових файлів, як в  системах. Додатково до цього необхідно вміти швидко, легко і рівномірно звертатися до різних внутрішніх об’єктів системи з командного рядка або скриптів.

На момент написання цієї книги остання версія Windows 10 має три стандартних (тобто не вимагає додаткової установки) інструменти для автоматизації роботи в операційній системі:

  1. Командний рядок інтерпретатора cmd.exe, який підтримує простий (хоча і досить специфічний) мову пакетних файлів.

  2. Сервер сценаріїв Windows Script Host (WSH), який дозволяє запускати сценарії VBScript і JScript.

  3. Командна оболонка та середовище виконання сценаріїв Windows PowerShell.

ЗАУВАЖЕННЯ

Taк в Windows 10 за допомогою підсистеми WSL (Windows Subsystem for Linux) можна встановити дистрибутив з Microsoft Store (  наприклад, Debian і Ubuntu) і використовувати його командну оболонку для роботи з файловою системою Windows або  запуску Аналогічним чином в  цьому випадку можна буде запустити утиліти Linux в командному рядку Windows. Такий змішаний підхід надає нові цікаві можливості для автоматизації,  Однак вона виходить за рамки цієї книги, розглядати її тут ми не будемо.

Ці інструменти з’явилися не одночасно (пакетні файли підтримуються в операційних системах Microsoft з 1980-х років, а PowerShell з’явився чверть століття пізніше), вони мають різні можливості і в тій чи іншій мірі задовольняють вимогам до ідеального засобу автоматизації в Windows, про які ми говорили раніше.

ЗАУВАЖЕННЯ

Якщо ви хочете і маєте відповідний досвід, ви можете писати скрипти для автоматизації роботи в операційній системі на універсальних скриптових мовах (наприклад, Python, Ruby або JavaScript для Node js). Однак в цьому випадку платформи для підтримки цих мов і бібліотек для роботи з внутрішніми об’єктами Windows доведеться встановлювати і налаштовувати додатково, за замовчуванням вони недоступні в Windows Перевагами стандартних засобів автоматизації Windows (особливо PowerShell) є гарантована доступність в будь-якій версії Windows (це дуже важливо для системних адміністраторів, які керують багатьма робочими станціями), простота навчання, можливість роботи з внутрішніми об’єктами операційної системи самим природним способом.

Командний інтерпретатор cmd.exe

У стандартному командному рядку Windows, який використовує інтерпретатор cmd.exe, можна виконувати два типи команд:

  • Внутрішні, що виконуються безпосередньо самим інтерпретатором

  • Зовнішні, представлені виконуваними утилітами

В якості внутрішніх команд реалізовані операції з файловою системою і базові алгоритмічні оператори (if, for), що дозволяють використовувати пакетні файли з розширенням bat або cmd як прості скриптові програми.

Інтерпретатор cmd.exe підтримує концепцію стандартних текстових потоків, запозичених з UNIX, і механізм перерозподілу пристроїв вводу-виводу (мал.2).

 

Мал. 1.2. Стандартні текстові потоки та пристрої у Windows

Таким чином, в Windows, як і в UNIX, текстова інформація (потік тексту) може передаватися по конвеєру між декількома командами. І.Г.).

Оболонка командного рядка cmd.exe і пакетні файли, підтримувані цим інтерпретатором, є найпростішими і універсальними інструментами для автоматизації простих завдань, які будуть надійно працювати в будь-якій конфігурації операційної системи.

Мал. 1.3. Конвеєризація команд cmd exe інтерпретатора

Для створення пакетних файлів потрібно знати зовсім небагато: синтаксичні особливості інтерпретатора cmd.exe і можливості декількох десятків внутрішніх команд і стандартних утиліт командного рядка. Конкретні клавіші, за допомогою яких потрібно запускати ці команди і утиліти, можна знайти у вбудованій довідці.

Лістинг коду 1.1. Приклад пакетного файлу (cmd.exe інтерпретатора)

@echo off
rem *****************************************************************
rem * Имя: sort_reps.bat
rem * Язык: cmd.exe
rem * Описание: Формирование списка каталогов с отчетами
rem *****************************************************************
if exist temp.txt del temp.txt
if exist odb.txt del odb.txt
for /D %%f in (d:\odb2101*) do (
dir /s/Ь %%f\od*.htm » temp.txt)
for /f "delims=\ tokens=4" %%i in ('sort /+17 temp.txt') do (
echo %%i » odb.txt)
del temp.txt

Однак пакетні файли cmd.exe не можна вважати повноцінними скриптами, що дозволяють використовувати всі можливості Windows. Основна проблема полягає в тому, що в Windows немає стандартних зручних утиліт для роботи з внутрішніми моделями об’єктів. Крім того, сама мова пакетних файлів недостатньо розвинений: він не підтримує роботу з масивами або структурами, відсутні логічні операції в умовах, неможливо безпосередньо заявити про функцію.

Пояснення цих недоліків тільки одне – історичне. Справа в тому, що командний інтерпретатор cmd.exe з’явився на початку 1990-х років, це одне з найперших додатків для операційної системи Windows NT, на базі якого будуються всі наступні версії Windows. Головним завданням тоді було домогтися того, щоб сумісність з оболонкою command.com попередньою операційною системою MS-DOS, яка не мала ніяких внутрішніх об’єктних систем. На той момент Microsoft орієнтувалася на максимально широку аудиторію недосвідчених користувачів, які не бажали вникати в технічні деталі системи. Основні зусилля розробників були спрямовані на поліпшення графічної оболонки системи для більш комфортної роботи непрофесіоналів, а не на створення робочого середовища для фахівців (системних адміністраторів і розробників) або досвідчених користувачів.

Сервер сценаріїв Windows Script Host

Для вирішення перерахованих вище проблем з функціональністю і зручністю використання традиційних пакетних файлів Windows були можливі два варіанти:

  • Розширити число стандартних утиліт командного рядка і значно розширити мову інтерпретатора cmd.exe, перетворивши його в повноцінний алгоритмічну мову з підтримкою об’єктно-орієнтованого програмування (при цьому модифікований інтерпретатор команд повинен підтримувати і попередній синтаксис мови командного файлу).

  • Виберіть ще одну просту мову програмування для сценаріїв Windows, яка була б знайома користувачам цієї операційної системи, підтримувала б всі стандартні алгоритмічні можливості і конструкції, а також дозволяла працювати з внутрішніми об’єктами операційної системи.

Розробники Microsoft пішли другим шляхом і на початку 2000-х запропонували використовувати VBScript (Visual Basic Script Edititon) в якості стандартної мови сценаріїв Windows. Ця мова була обрана на основі наступних критеріїв.

Про розвиток. VBScript – це повноцінна алгоритмічна мова, яка має вбудовані функції і методи розбору рядків символів, виконання математичних операцій, обробки винятків і т.д.

Легко вчитися. VBScript заснований на BASlC (скорочення від Begginner’s All-purpose Symbolic Instruction Code), який був розроблений в l964 в Дартмутському коледжі як спеціальний інструмент для написання програм непрофесіоналами. Одне з головних вимог, яке було враховано при створенні цієї мови – простота використання для початківців.

Поширеність. BASlC був стандартною мовою програмування для домашніх персональних комп’ютерів в 1970-х і 1990-х роках. Перший інтерпретатор цієї мови від Microsoft (Altair BASIC) був розроблений ще в 1975 році, до кінця 1980-х років BASIC встановлювався практично на всі персональні комп’ютери (як PC-сумісні віртуальні машини, так і комп’ютери Apple). В операційних системах Windows 95/98 інтерпретатор Microsoft QBasic і середовище розробки були встановлені в якості стандартного компонента системи.

Модифікації мови BASIC в той час використовувалися в різних областях операційної системи Windows.

  • Стандартні автономні застосунки Windows (Visual Basic є частиною середовища розробки Microsoft Visual Studio).

  • Макроси для автоматизації роботи в офісних додатках Microsoft (Visual Basic for Applications (VBA)).

  • Скрипти в динамічних клієнтських скриптах (VBScript підтримувався lnternet Explorer).

  • Скрипти в сервері для веб-сервера lntemet lnformation Server.

Розширюваність із зовнішніми об’єктами. VBScript має функцію CreateObj ect, яка дозволяє скриптам отримувати доступ і використовувати багато зовнішніх об’єктів, зареєстрованих в операційній системі.

Про можливість додавання графічного інтерфейсу  Скрипти VBScript можуть бути вбудовані в  створення так званих HTML-додатків.

VBScript і JScript (реалізація стандарту ECMAScript від Microsoft, аналогічна JavaScript) вже використовувалися в скриптах, вбудованих в HTML-сторінки, а інтерпретатори цих мов (vbscript.dll і jscript.dll динамічні бібліотеки) були стандартними компонентами Windows. Однак безпосередньо використовувати скрипти всередині  як сценарії операційної системи не вдалося, оскільки всі вкладені скрипти виконуються з урахуванням політик, які застосовуються до веб-браузера безпека, яка забороняє доступ до локальної файлової системи комп’ютера.

Для запуску скриптів VBScript і JScript безпосередньо в операційній системі, без браузера,  був створений спеціальний сервер сценаріїв Windows Script Host (WSH), який за замовчуванням включений у всі версії Windows з 2000 року.

Сценарії WSH – це текстові файли з розширенням .vbs (мова VBScript) або .js (мова JScript). Їх можна запускати в текстовому (консольному) режимі за допомогою програми cscript.exe або в графічному режимі за допомогою файлу wscript.exe.

Лістинг 1.2. Приклад сценарію VBScript

* Имя: MakeShortcut.vbs
'* Язык: VBScript
’* Описание: Создание ярлыков из сценария
Dim WshShell,oUrlLink
26 Часть I. Знакомимся с PowerShell
’ Создаем объект WshShell
Set WshShell=WScript.CreateObject("WScript.Shell")
’ Создаем ярлык на сетевой ресурс
Set oUrlLink = WshShell.CreateShortcut("Microsoft Web Site.URL")
’ Устанавливаем URL
oUrlLink.TargetPath = "http://www.microsoft.com"
' Сохраняем ярлык
oUrlLink.Save

WSH вирішує проблему того, що VBScript і JScript не мають спеціальних функцій для управління операційною системою (наприклад, ці мови не мають функцій для роботи з файловою системою). Вся власне робота в скрипті виконується зовнішніми об’єктами, а WSH служить посередником між ними і інтерпретатором мови (мал1.4).

Мал. 1.4. Використання зовнішніх об’єктів зі сценаріїв WSH

Відзначимо, що крім стандартних мов Microsoft VBScript і JScript, для написання скриптів WSH можна використовувати і інші мови (наприклад, Perl або Python), для чого потрібно додатково встановити відповідний модуль підтримки.

Таким чином, сценарії WSH складаються з двох компонентів (мал. 1.5):

  • Про елементи обраної скриптової мови;

  • O зовнішні об’єкти, які не залежать від цієї мови.

Можливість використання повноцінних мов сценаріїв і різних зовнішніх об’єктів, доступних в операційній системі, зробила Windows Script Host потужним інструментом автоматизації. Однак через кілька років стало зрозуміло, що для проміжних користувачів і початківців системних адміністраторів написання нетривіальних практичних сценаріїв – завдання не з легких. Якщо для створення пакетних файлів досить було знати простий синтаксис мови, підтримуваного cmd.exe, і можливості пари десятків команд, то для грамотному скриптові WSH довелося як вивчати обраний скрипт скрипта (хоча у випадку з VBScript це зовсім не складно), так і розбиратися з нюансами підключення до об’єктних моделей для управління операційною системою різного типу (WMl, ADSl і т.д.) і шукати довідкову інформацію про ці об’єкти в зовнішніх джерелах.

Мал. 1.5. Сценарії WSH, мовні інтерпретатори та об’єктні моделі Windows

Крім того, Windows Script Host – це не командна оболонка, а лише середовище виконання сценаріїв, тому WSH не вистачає деяких зручностей інтерпретатора cmd.exe. Наприклад, для запуску зовнішньої виконуваної утиліти недостатньо просто вказати відповідне ім’я файлу, потрібно скористатися додатковими методами pip () і exe ( ) об’єкта WshShe11.

Рядки сценаріїв WSH не можуть виконуватися рядок за рядком інтерактивно. Якщо в cm.exe d ви можете запускати окремі команди або конвеєри з команд командного рядка на льоту і направляти їх висновок в текстовий файл, то в WSH потрібно створити окремий файл зі скриптом, прописати туди необхідні команди і запустити скрипт з операційної системи.

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

Хоча WSH залишається стандартним компонентом Windows, VBScript і JScript зараз знаходяться в немилості і не розвиваються (остання версія движка сценаріїв WSH була випущена в 2006 році).

Оболонка PowerShell і середовище виконання сценаріїв

Знаючи про проблеми в пакетних файлах cmd.exe і скриптах Windows Script Host, Microsoft вирішила розробити абсолютно нове потужне середовище для створення сценаріїв і роботи в командному рядку. Вперше цей інструмент був публічно представлений в 2003 році під кодовою назвою Monad, а потім був перейменований в PowerShell і використовується в Windows з 2006 року. У 2017 році Microsoft відкрила вихідний код PowerShell, тепер це проект Orep

Source (репозиторій проекту розміщений на GitHub: https://github.com/PowerShell/ PowerShell). Оболонка стала кроссплатформенною, працювати з нею можна не тільки в Windows, але і в macOS і Linux.

Спочатку головною і найбільш амбітною метою розробників PowerShell було створення середовища для написання і виконання скриптів, яка найкращим чином підходила б для операційної системи Windows і була б більш функціональною, розширюваною і простою у використанні, ніж будь-який аналогічний продукт для будь-якої іншої операційної системи.

Перш за все, це середовище повинна була бути придатною для вирішення завдань, що стоять перед системними адміністраторами (таким чином, Windows отримала б додаткову перевагу в боротьбі за сектор корпоративних платформ), а також відповідати вимогам розробників програмного забезпечення, надаючи їм засоби для швидкої реалізації інтерфейсів управління створюваними ними додатками.

Для досягнення поставлених цілей були вирішені наступні завдання:

Про надання прямого доступу командного рядка до об’єктів COM, WMI та .NET Framework. PowerShell надає команди, що дозволяють інтерактивно працювати з об’єктами COM, а також з екземплярами класів, визначених в інформаційних схемах WMl і .NET Framework;

Про організацію роботи з ДОВІЛЬНИМИ даними в командному рядку за принципом файлової системи. Наприклад, навігація по системному реєстру або сховищу цифрових сертифікатів здійснюється з командного рядка за допомогою cn1d.exe аналога команди інтерпретатора CD;

Розробка інтуїтивно зрозумілої уніфікованої структури вбудованих команд на основі їх ФУНКЦІОНАЛЬНОГО призначення. У PowerShell назви всіх внутрішніх команд (які називаються командлетами) відповідають шаблону дієслова-іменника, наприклад Get-Process (отримати інформацію про процес), Stop-Service (зупинити службу), C1ear-Host (очистити екран консолі) тощо. В результаті легше запам’ятовувати і вчити команди;

Про надання можливості розширення вбудованого набору команд. Внутрішні команди PowerShell можуть бути доповнені командами, які створюються користувачами і повністю інтегруються в оболонку;

Про організацію підтримки знайомих команд від Other shells. У PowerShell найчастіше використовуються стандартні команди з оболонок cmd.exe і UNIX-060 підтримуються на рівні псевдонімів ваших власних внутрішніх команд. Наприклад, якщо користувач, якому доручено працювати, виконає команду 1s, він отримає очікуваний результат: список файлів в поточному каталозі (те ж саме стосується і команди dir);

Про перехешування автодоповнення при наборі команд shien, їх параметрах, а також шиен вуалі і папках. Ця функція значно спрощує і прискорює введення команд з клавіатури.

Інтерактивний сеанс в PowerShell аналогічний роботі в інших оболонках командного рядка. PowerShell простий в освоєнні і легше писати скрипти, які звертаються до зовнішніх об’єктів, ніж VBScript або JScript. Особливу увагу було приділено питанням безпеки при роботі зі скриптами (наприклад, запустити скрипт можна тільки з повним шляхом до нього, а за замовчуванням скрипти PowerShell взагалі заборонено запускати скрипти PowerShell в системі).

Головною особливістю PowerShell, яка відрізняє його від усіх інших оболонок командного рядка, є його об’єктна орієнтація. Одиницею обробки і передачі інформації в PowerShell є об’єкт (дані і власні методи), а не рядки тексту, як в інших оболонках. Завдяки цьому працювати в PowerShell стає простіше, ніж в традиційних оболонках, так як не потрібно виконувати додаткові маніпуляції для вилучення необхідної інформації з потоку символів.

Для підтримки об’єктів розробники PowerShell вирішили не винаходити нічого нового і використовувати уніфіковану об’єктну модель .NET Framework. Таким чином, PowerShell є однією з мов програмування (рисунок 1.6). При цьому PowerShell не схожий на інші типи VB.NET або C#, це унікальна мова, що дозволяє поєднувати імперативний і декларативний стилі програмування в скриптах.

Рішення про використання .NET Framework було прийнято з кількох причин. По-перше, .NET Framework повсюдно поширений в розробці програмного забезпечення Windows і являє собою, зокрема, загальну інформаційну схему, за допомогою якої різні компоненти операційної системи можуть взаємодіяти один з одним.

По-друге, об’єктна модель .NET Framework самодокументується: кожна . NET-06RkT містить інформацію про його структурі. При інтерактивній роботі це дуже корисно, адже з’являється можливість виконати запит до конкретного об’єкта прямо з командного рядка і подивитися опис його властивостей і способів, тобто зрозуміти, які маніпуляції можна зробити з цим об’єктом, не вивчаючи додаткову документацію з його описом.

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

Мал. 1.6. Схема роботи програм на NET-мові

Текстові рядки. Давайте розглянемо приклад. Windows має утиліту списку завдань, яка надає інформацію про запущені в системі процеси:

С:\>tasklist
Имя образа PID Имя сессии N‘ сеанса Память
System Idle Process 0 0 16 КБ
System 4 0 32 КБ
smss.exe 560 0 68 КБ
csrss.exe 628 0 4 336 КБ
winlogon.exe 652 0 3 780 КБ
services.exe 696 0 1 380 КБ
lsass.exe 708 0 1 696 КБ
svchost.exe 876 0 1 164 КБ
svchost.exe 944 0 1 260 КБ
svchost.exe 1040 0 10 144 КБ
svchost.exe 1076 0 744 КБ
svchost.exe 1204 0 800 КБ
spoolsv.exe 1296 0 1 996 КБ
kavsvc.exe 1516 0 9 952 КБ
kinagent.exe 1660 0 5 304 КБ
klswd.exe 1684 0 64 К

Припустимо, що ми хочемо використовувати цю утиліту для визначення того, скільки оперативної пам’яті витрачає процес kavsvc в командному файлі інтерпретатора cmd .exe. еге. Для цього виберіть відповідний рядок з вихідного потоку команди task1ist, витягніть з нього підрядок, що містить потрібне число, і приберіть пробіли між цифрами (слід врахувати, що, в залежності від налаштувань операційної системи, роздільником цифр може бути не пробіл, а інший символ).

У PowerShell аналогічну задачу можна вирішити за допомогою команди Get-Process, яка повертає набір об’єктів, кожен з яких відповідає одному запущеному процесу. Для визначення пам’яті, споживаної процесом kavsvc. ехе, немає необхідності в додаткових маніпуляціях з текстом, потрібно просто взяти значення властивості ws об’єкта, відповідного цьому процессу.

Нарешті, об’єктна модель .NET Framework дозволяє PowerShell безпосередньо використовувати функціональність різних бібліотек, які є частиною фреймворка. Наприклад, щоб дізнатися, якого дня тижня було 9 листопада 1974 року, можна виконати таку команду в оболонці PowerShell:

(Get-Date ”09.11.1974”).DayOfWeek

У цьому випадку повертається команда Get-Date . NET-06RkT типу DateTime, який має властивість DayOfWeek, яка обчислює день тижня для певної дати. Таким чином, розробникам PowerShell не потрібно створювати спеціальну бібліотеку для роботи з датами і часом – вони просто беруть готове рішення в .NET Framework.

Підсумки

  • Командний рядок і скрипти дозволяють автоматизувати роботу в операційній системі, витрачати менше часу на рутинні операції.

  • Операційні системи UNIX і Windows засновані на принципово різних підходах. Принципи UNIX  – «все є файл» і «все є текст», принцип Windows – «все є об’єкт». Тому  в системах (macOS, Linux) завдання автоматизації зводяться до маніпулювання файловою системою і обробки тексту, а для управління Windows додатково потрібно вміти працювати з внутрішніми об’єктними моделями.

  • Windows має три стандартні засоби автоматизації: пакетні файли командного рядка та інтерпретатора cmd.exe, сценарії Windows Script Host (WSH) у VBScript та JScript, командний рядок та середовище виконання сценаріїв Windows PowerShell.

  • Microsoft припинила розробку cmd і WSH, вони підтримуються для роботи раніше розроблених скриптів. Основним інструментом в сьогоденні і майбутньому є PowerShell.

  • На відміну від всіх інших оболонок, команди PowerShell спілкуються між собою не за допомогою рядків символів, а через об’єкти. PowerShell – одна з мов,   яка дозволяє поєднувати імперативний і декларативний стилі програмування в скриптах.

  • Вихідний код PowerShe11 відкритий, оболонка кросплатформна, її можна встановити на macOS і Linux.

Дякуємо нашій команді волонтерів за надану інформацію з відкритих джерел.

Інші статті по темі
ОсвітаСамонавчання
Читати далі
Частина 4. Знайомимося з PowerShell (Робота в оболонці PowerShell)
Дізнайтесь основні концепції, синтаксис та приклади використання команд та сценаріїв для автоматизації рутинних завдань та захисту даних. Підвищуйте продуктивність та оптимізуйте роботу з системою завдяки PowerShell.
791
ОсвітаСамонавчання
Читати далі
Частина 5. Знайомимося з PowerShell (Робота з об’єктами)
Робота з об'єктами PowerShell - це повний посібник, призначений для навчання користувачів роботі з об'єктами в командній оболонці PowerShell. У цьому посібнику представлені основні концепції та техніки роботи з об'єктами, включаючи створення, зчитування, зміну та видалення даних.
694
ОсвітаСамонавчання
Читати далі
Частина 6. Знайомимося з PowerShell (Управління виведенням команд)
Управління виведенням команд у PowerShell" - детальний посібник, який допоможе вам керувати та оптимізувати виведення результатів команд в PowerShell, забезпечуючи більш ефективну та зручну роботу з цією командною оболонкою.
779
ОсвітаСамонавчання
Читати далі
Частина 8. PowerShell як мова програмування (Оператори та керуючі інструкції)
PowerShell надає детальний огляд різних типів операторів і керуючих інструкцій, які дозволяють програмістам ефективно працювати зі скриптами та автоматизувати рутинні завдання в середовищі Windows.
797
ОсвітаСамонавчання
Читати далі
Частина 10. PowerShell як мова програмування (Обробка помилок при виконанні команд)
Обробка помилок у PowerShell: Забезпечення стабільності та безпеки виконання програм та скриптів. Дізнайтесь про конструкції try-catch та команду -ErrorAction для ефективної обробки помилок у PowerShell та забезпечення надійного функціонування ваших проектів.
667
Знайшли помилку?
Якщо ви знайшли помилку, зробіть скріншот і надішліть його боту.