Досвідчені користувачі операційної системи Windows 10 могли чути про утиліту командного рядка PowerShell. Також з нею можуть бути знайомі мають досвід роботи з Windows 7 і 8.1. Після багатьох років використання програми командного рядка Windows і файлів формату .bat прийшов час познайомитися з більш функціональним інструментом.

PowerShell є цінним поповненням списку інструментів Windows і його масштаб може відлякати деяких користувачів. Що це — скриптова мова або командна оболонка? Не варто турбуватися: незважаючи на великі можливості, освоїти PowerShell силу кожному.

Крок 1: установка

Для початку нам потрібна сама утиліта PowerShell. Якщо ви працюєте з Windows 10, у вас вже встановлена версія PowerShell 5. Оновлення Windows 10 Anniversary Update використовує версію 5.1, але різниця непомітна. У Windows 8 8.1 застосовується PowerShell 4, чого теж цілком достатньо. Установка PowerShell на Windows 7 не доставить проблем, але все ж пару зайвих кроків доведеться зробити. Зокрема, потрібно додатково встановити .Net Framework. Можна встановити Windows Management Framework, до складу якого входить PowerShell.

У PowerShell є два інтерфейсу. Досвідчені користувачі можуть вибрати повноцінний графічний інтерфейс, відомий як Integrated Scripting Environment (ISE). Новачкам краще використовувати консоль PowerShell, простий текстовий інтерфейс в стилі командного рядка Windows або навіть DOS 3.2.

Для запуску PowerShell від імені адміністратора в Windows 10 натисніть на кнопку «Пуск» і перейдіть додатків до Windows PowerShell. У Windows 8.1 шукайте Windows PowerShell в папці System Windows. У Windows 7 оболонка розташовується в папці Accessories. В якості звичайного користувача PowerShell можна запустити точно так само, використовуючи ліву кнопку миші замість правої.

В будь-якій версії Windows можна застосувати пошук. Для зручності подальшого використання можна закріпити PowerShell на панелі завдань.

Крок 2: старі команди Windows

Синтаксис команд Windows PowerShell працює звичним чином. Наприклад, cd змінює папки, dir показує список всіх файлів і папок всередині поточної папки.

В залежності від методу запуску консолі PowerShell можна почати в c:Windowssystem32 або c:Users<username>. У прикладі на скріншоті використовується команда cd .. (з пробілом) для переходу на один рівень вгору за раз, потім запускається команда dir для відображення списку файлів і папок в директорії C:.

Крок 3: установка файлів допомоги

Команди зразок cd і dir не є активними командами оболонки PowerShell. Це так звані псевдоніми (aliases) — заміни справжніх команд PowerShell. Псевдоніми зручні для тих, хто має великий досвід роботи з командним рядком. Проте вони не зачіпають глибин PowerShell.

Щоб почати знайомитися з можливостями PowerShell, наберіть help потрібну вам команду. На скріншоті показано команда help dir.

Команда help каже, що dir є псевдонімом PowerShell команди Get-ChildItem. Якщо набрати get-childitem в PS C:>, побачите те ж саме, що і при використанні команди dir.

Як зазначено внизу екрана, файли допомоги для PowerShell не встановлюються автоматично. Для їх одержання запустіть PowerShell від імені адміністратора і наберіть update-help. Установка файлів допомоги займе кілька хвилин, ряд модулів можуть бути відсутніми, наприклад, в даному випадку не встановилися Help for NetWNV і SecureBoot. Коли все готово, повна система допомоги завжди буде давати потрібні підказки.

Тепер наберіть команду get-help і будь-яку цікаву для вас команду («cmdlet» мовою PowerShell, по-російськи командлети), буде показано її опис. Наприклад, get-get help-childitem видає список опцій get-childitem. Також можна вивести різні можливі варіанти. Наприклад

get-get help-childitem -examples

видає сім детальних прикладів використання get-childitem. Команда

get-get help-childitem -detailed

включає в себе ці сім прикладів і докладні роз’яснення кожного параметра в командлет get-childitem.

Крок 4: отримання допомоги по параметрам

На скріншоті help dir ви могли помітити два списку під SYNTAX для get-childitem. Наявність двох різних синтаксисів означає можливість застосування двох способів запуску команди. Як тримати синтаксис окремо один від одного і що означають параметри? Відповідь простий, якщо знати трюк.

Для отримання подробиць щодо параметрів командлети get-childitem або будь-який інший використовуйте параметр -full:

get-get help-childitem -full

Це видає список того, що ви можете зробити з командлетой і що станеться. Дивіться на скріншот.

Перегляд опису параметрів дозволяє помітити, що get-childitem дає можливість отримати об’єкт child (зразок назви підпапки або імені файлу) в зазначеному місці, за збігом певних символів або без. Наприклад:

get-childItem “*.txt” -recurse

повертає список файлів «*.txt» у поточній теці та всіх підпапках (через параметр -recurse). Тоді як

get-childitem “HKLM:Software”

повертає список всіх ключів реєстру верхнього рівня HKEY_LOCAL_MACHINESoftware.

Якщо ви коли-небудь намагалися потрапити до реєстру за допомогою командного рядка Windows або файлів .bat, ви зможете оцінити функціональність цього варіанта доступу.

Крок 5: вивчення імен

Є причина того, чому показані досі командлети виглядають подібним чином: get-childitem, update-help”, ” get help використовують єдину схему дієслово-іменник. Це угода застосовують усі командлети PowerShell, в них дієслово стоїть перед єдиним іменником. Це сподобається тим, хто свого часу постраждав від непостійності назв команд мови VB і VBA.

Погляньте на найпоширеніші командлети:

set-location: встановлює поточну робочий локацію на певну локацію

get-content: отримує вміст файлу

get-item: отримує файли і папки

copy-item: копіює об’єкт з однієї локації в іншу

remove-item: видаляє файли і папки

get-process: отримує процеси, запущені на локальному або віддаленому комп’ютері

get-service: отримує сервіси, запущені на локальному або віддаленому комп’ютері

invoke-webrequest: отримує вміст веб-сторінки в інтернеті

Для перегляду роботи певної командлети використовуйте get-help як у випадку

get-help copy-item -full

На основі опису допомоги можна зрозуміти, що необхідно cmdlet. Наприклад, якщо ви хочете копіювати всі файли і папки з Documents у c:temp використовуйте

copy-item c:users[ім’я користувача] documents* c:temp

Ввівши цю команду, ви побачите кілька цікавих можливостей оточення PowerShell. Наприклад, якщо набрати copy-i і натиснути кнопку Tab, PowerShell заповнить Copy-Item. Якщо неправильно набрати статті командлет і PowerShell не може розпізнати її, дається повний опис того, що було зроблено не так.

Спробуйте дану статті командлет:

invoke-webrequest askwoody.com

Ви отримаєте короткий список заголовків, зображень, посилань та іншого вмісту веб-сторінки. Зверніть увагу get-help список invoke-webrequest, який «повертає колекцію форм, посилань, зображень та інші важливі елементи HTML» — саме те, що повинно відображатися на екрані.

Деякі командлети допомагають керувати самим PowerShell:

get-command: список всіх доступних командлет

get-verb: список всіх доступних дієслів

clear-host: очистка екрану програми-хоста

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

get-command *-service

Будуть показані всі дієслова, доступні з іменником service. Ось їх список:

Get-Service

New-Service

Restart-Service

Resume-Service

Set-Service

Start-Service

Stop-Service

Suspend-Service

Можна об’єднувати ці командлети з іншими.

Крок 6: використання труб

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

dir > temp.txt

ping askwoody.com | find “packets” > temp2.txt

Тут у другій команді find шукає рядок packets, взяту з адреси askwoody.com командою ping і об’єднує всі відповідні рядки в файл під назвою temp2.txt.

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

ping askwoody.com | select-string packets | out-file temp2.txt

Використання перенаправлення і труб значно розширює можливості командного рядка Windows: замість нескінченного прокручування вниз по екрану в пошуку текстового рядка можна фільтрувати потрібні команди Windows.

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

Складна частина починається при вибудовуванні об’єктів. Поставляються одним cmdlet об’єкти повинні співпадати з типом об’єктів, прийнятих отримують cmdlet. Текст є досить простим типом об’єктів, так що якщо ви працюєте з текстом, вирівнювання об’єктів є простим завданням. Інші об’єкти не такі елементарні.

Як це зрозуміти? Використовуйте статті командлет get-member. Якщо ви хочете знати, який тип об’єкта обробляє команди, проведіть її через get-member. Наприклад, якщо ви намагаєтеся зрозуміти запущені на комп’ютері процеси і звузили опції до командлети get-process, ось як дізнатися результат командлети:

get-process | get-member

Запуск цієї командлети видає довгий список властивостей і методів для get-process, але в самому початку списку можна побачити тип об’єкта, який створює get-process:

TypeName: System.Diagnostics.Process

Нижченаведений скріншот також показує властивості get-process під назвою get-process Handles, Name, NPM, PM, SI, VM і WS.

Якщо ви хочете маніпулювати результатом get-process для роботи з цим cmdlet (замість відображення довгого списку активних процесів на моніторі), потрібно знайти іншу команду, яка в якості ввідних даних приймає System.Diagnostics.Process. Для пошуку потрібної командлети знову використайте можливості PowerShell:

get-command -Parametertype System.Diagnostics.Process

Ця командлета видає список команди, які можуть обробляти System.Diagnostics.Process.

Деякі командлети відомі тим, що приймають майже будь-який вид даних. Головною серед них є where-object. Ця командлета пропускає через себе кожен посланий по трубі об’єкт, один за одним, та застосовує до нього заданої критерії вибору. Існує спеціальний маркер під назвою $_, який дозволяє використовувати кожен предмет в трубі, один за раз.

Припустимо, ви хочете отримати список всіх запущених на комп’ютері процесів з назвою «svchost», тобто хочете зіставити властивість Name процесу svchost. Використовуйте команду:

get-process | where-object {$_.Name -eq “svchost”}

Командлета where-object дивиться на кожен об’єкт System.Diagnostics.Process, порівнює .Name цього об’єкту з «svchost»; якщо є збіги, вони видаються на монітор. Дивіться на скріншот.

Крок 7: аналіз корисних команд PowerShell

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

Ці команди працюють тільки в Windows 10 і тільки при запуску PowerShell від імені адміністратора. Вони призначені для переустановки встановлених додатків Windows 10 і можуть стати в нагоді тим, хто спочатку вилучив ці програми, а потім вирішив повернути їх. Команди виглядає наступним чином:

Get-AppXPackage | Foreach {Add-AppxPackage -DisableDevelopmentMode -Register “$($_.InstallLocation)AppXManifest.xml”}

Якщо запустити цю команду, ігноруйте позначені червоним кольором попередження, і коли команда виконана, перезавантажте комп’ютер; всі встановлені програми в Windows 10 з’являться на своїх місцях.

Ось як працює ця команда. Get-AppXPackage перевіряє всі пакети додатків в профілі користувача. Навіть якщо ви видалили додаток, воно залишається в списку профілю користувача.

Командлет Get-AppXPackage повертає об’єкт TypeName Microsoft.Windows.Appx.PackageManager.Commands.AppxPackage, який включає в себе повне ім’я пакета програм та місцезнаходження відповідного файлу маніфесту XML. Якщо запустити статті командлет get-appxpackage, ви побачите довгий список пакетів програм. Скріншот показує опис програми Xbox.

Командлета Foreach допомогою циклу проходить через кожен об’єкт в AppXPackage, відправляючи їх статті командлет Add-AppxPackage. Згідно get-help для Add-AppxPackage, тут є два ключових перемикача:

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

Рядок «$($_.InstallLocation)AppXManifest.xml» описує, де розташований файл manifest.xml. Якщо подивитися на файли AppXManifest.xml ви побачите складний список ідентифікаторів програм, виконуваних файлів і велика кількість візуальних елементів, пов’язаних з додатком.

Після перезавантаження всі додані пакети програм завантажуються і встановлюються з магазину Windows Store.