PowerShell є потужною командною оболонкою та мовою сценаріїв, яка забезпечує безліч інструментів для управління операційною системою Windows. Одним із ключових аспектів роботи з PowerShell є робота з об’єктами, що дозволяє легко та ефективно керувати даними та виконувати різноманітні завдання. У посібнику “Робота з об’єктами PowerShell” ви дізнаєтесь про основні концепції роботи з об’єктами в PowerShell, включаючи створення, зчитування, зміну та видалення об’єктів. Ви також ознайомитеся з маніпулюванням даними, фільтрацією, сортуванням та групуванням об’єктів для отримання потрібних результатів. З використанням реальних прикладів та практичних вправ, цей посібник допоможе вам освоїти техніки роботи з об’єктами PowerShell, що зробить вашу роботу з Windows більш ефективною та продуктивною.
У попередніх розділах ми вже неодноразово говорили, що всі дії в оболонці PowerShell пов’язані з операціями над об’єктами. Незайвим буде нагадати, що об’єкт – це сукупність даних (поля чи властивості об’єкта) та способів роботи з цими даними (методи об’єкта). Конкретна структура об’єкта, тобто склад властивостей та методів, задається його типом. Набір типів, що використовуються у Windows PowerShell, базується на типах уніфікованої платформи .NET Framework, яка повсюдно використовується в операційній системі Windows. Наприклад, будь-якому файлу на жорсткому диску PowerShell відповідає .NET-06RkT типу System. те. Fi1eInfo. Властивість об’єкта – це відомості про його атрибути. Так, об’єкт System. те. Fi1eInfo є властивість Length (довжина), що відповідає розміру файлу, який представлений даним об’єктом. Метод об’єкта є дією, яку можна здійснювати над цим об’єктом. Наприклад, об’єкт System. 10. Fi1eInfo є метод соруто, за допомогою якого можна скопіювати представлений даним об’єктом файл на рівні файлової системи. Властивості та методи об’єктів використовуються у командлетах PowerShell для виконання різних дій та роботи з даними. Як ми вже неодноразово згадували, PowerShell підтримується механізм конвеєризації (композиції) команд, що спрощує виконання операцій над об’єктами.
Механізм композиції, де вихідний потік однієї команди перенаправляється на вхідний потік іншої, є, мабуть, найціннішою концепцією інтерфейсів командного рядка. Конвеєри не тільки зменшують зусилля, пов’язані з введенням складних команд, але і полегшують відстеження потоку роботи між командами. Корисною особливістю трубопроводів є те, що вони не залежать від кількості переданих предметів, так як трубопровід впливає на кожен елемент окремо. В результаті, як правило, знижується витрата ресурсів на складні команди і з’являється можливість отримувати вихідну інформацію відразу.
В оболонці Tayuke PowerShell дуже широко використовується механізм конвеєризації команд, але тут конвеєр – це не потік тексту, як у всіх інших оболонках, а об’єкти. При цьому з елементами трубопроводу можуть виконуватися різні маніпуляції: фільтрувати об’єкти за певним критерієм, сортувати і групувати об’єкти, змінювати їх структуру.
Конвеєр в PowerShell – це послідовність команд, розділених знаком (трубним стрижнем). Кожна команда в конвеєрі отримує об’єкт від попередньої команди, виконує над ним певні операції і передає наступній команді в трубопроводі. З точки зору користувача, об’єкти упаковують пов’язану інформацію в форму, в якій інформацією легше маніпулювати як єдиним цілим і з якої при необхідності витягуються певні елементи.
Зручніше працювати з даними, які передаються між командами у вигляді об’єктів, ніж з текстовою інформацією. Адже команда, яка отримує потік тексту з іншої утиліти, повинна його проаналізувати, розібрати і відібрати потрібну їй інформацію, а це може бути складно, так як зазвичай висновок команди більше орієнтований на візуальне сприйняття людини (це природно для інтерактивного режиму роботи), а не на зручність подальшого розбору.
При трубопроводах об’єктів такої проблеми не виникає, тут необхідна інформація витягується з елемента трубопроводу простим зверненням до відповідного властивості об’єкта. Однак тепер виникає нове питання: як саме дізнатися, якими властивостями володіють об’єкти, які пропускаються по трубопроводу? Адже при виконанні того чи іншого командлета ми бачимо на екрані тільки один або кілька стовпців форматованого тексту. Наприклад, запустимо командлет Get-Process, який відображає інформацію про активні процеси:
PS С:\> Get-Process Handles NPM(K) РМ (К) WS (К) VM(M) CPU(s) Id ProcessName 158 11 45644 22084 126 159.69 2072 AcroRd32 98 5 1104 284 32 0.10 256 alg 39 1 364 364 17 0.26 1632 ati2evxx 57 3 1028 328 30 0.38 804 atiptaxx 434 6 2548 3680 27 21.96 800 csrss 64 3 812 604 29 0.22 1056 ctfmon 364 11 14120 9544 69 11.82 456 explorer 24 2 1532 2040 29 5.34 2532 Far
По суті, на екрані ми бачимо тільки зведену інформацію (результат форматування отриманих даних), а не повне представлення вихідного об’єкта. З цієї інформації не зрозуміло, скільки саме властивостей мають об’єкти, згенеровані командою Get-Process, і які імена мають ці властивості. Наприклад, ми хочемо знайти всі «завислі» процеси, які не відповідають на системні запити.
Чи можна це зробити за допомогою командлета Get-Process, яку властивість потрібно перевірити на наявність об’єктів виводу для цього?
Щоб відповісти на такі питання, спочатку потрібно навчитися досліджувати структуру об’єктів PowerShell, дізнатися, якими властивостями і методами володіють ці об’єкти.
Щоб проаналізувати структуру об’єктів, повернутих певною командою, найпростішим способом конвеєризації цих об’єктів є використання командлета Get-Member (псевдонім dt), наприклад:
PS С:\> Get-Process | Get-Member
TypeName: System.Diagnostics.Process
Name MemberType Definition
Handles AliasProperty Handles = Handlecount
Name AliasProperty Name = ProcessName
NPM AliasProperty NPM = NonpagedSystemMemorySize
PM AliasProperty PM = PagedMemorySize
VM AliasProperty VM = VirtualMemorySize
WS AliasProperty WS = WorkingSet
Responding Property System.Boolean Responding {get;
В результаті ми можемо побачити на екрані, які об’єкти повернулися в процесі роботи досліджуваного командлета (в наведеному прикладі це і є Система. Діагностика. Process), і таюке повний перелік елементів об’єкта (зокрема, цікавить нас властивість Responding, яке визначає «завислі» процеси). При цьому на екрані виводиться безліч елементів різного типу (імена властивостей і псевдоніми, назви методів і т.д.), і такий довгий список стає незручним для перегляду. Командлет Get-Member має параметр -MemberType, який дозволяє нумерувати тільки члени об’єкта певного типу. Наприклад, щоб відобразити лише елементи об’єкта, які є властивостями цього об’єкта, використовуйте параметр -MerrberType зі значенням Властивість:
PS С:\> Get-Process I Get-Member -MemberType Property
TypeName: System.Diagnostics.Process
Name
BasePriority
Container
MemberType Definition
Property System.Int32 BasePriority {get;}
Property System.ComponentModel.IContainer...
94
EnableRaisingEvents Property
ExitCode Property
ExitTime Property
Handle Property
HandleCount Property
HasExited Property
Id Property
MachineName Property
Responding Property
System.Boolean EnableRaisingEven...
System.Int32 ExitCode {get;}
System.DateTime ExitTime {get;}
System.IntPtr Handle {get;}
System.Int32 HandleCount {get;}
System.Boolean HasExited {get;}
System.Int32 Id {get;}
System.String MachineName {get;}
System.Boolean Responding {get;}
Як бачите, процеси операційної системи відповідають об’єктам, які мають масу властивостей, але при роботі командлета Get-Process на екрані відображаються лише деякі з них. По суті, PowerShell відображає об’єкти різних типів в декількох файлах конфігурації з розширенням .pslxml (.xml), які знаходяться в каталозі, де встановлений файл powershell.exe (шлях до цього каталогу зберігається в змінній $PSHome). Список цих файлів можна отримати за допомогою такої команди:
PS С:\> dir $pshome\*foxmat*.pslxml Directory: С:\Windows\System32\WindowsPowerShell\vl.О Mode LastWriteTime Length Name -a--- 12/7/2019 12:10 PM 12825 Certificate.format.pslxml -a--- 12/7/2019 12:10 PM 4994 Diagnostics.Format.pslxml -a--- 12/7/2019 12:10 PM 138013 DotNetTypes.format.pslxml -a--- 12/7/2019 12:10 PM 10112 Event.Format.pslxml -a--- 12/7/2019 12:10 PM 25306 FileSystem.format.pslxml -a--- 12/7/2019 12:10 PM 91655 Help.format.pslxml -a--- 12/7/2019 12:10 PM 138625 HelpV3.format.pslxml -a--- 12/7/2019 12:10 PM 206468 PowerShellCore.format.pslxml -a--- 12/7/2019 12:10 PM 4097 PowerShellTrace.format.pslxml -a--- 12/7/2019 12:10 PM 8458 Registry.format.pslxml -a--- 12/7/2019 12:10 PM 16598 WSMan.Format.pslxml
Зокрема, правило форматування об’єкта типу System.Diagnostics.Process знаходиться у файлі DotNetTypes.format.pslxml. Безпосередньо редагувати конфігураційні файли не рекомендується, у разі необхідності можна створити власні файли форматування І ЗА ДОПОМОГОЮ командлета Update-FormatData включити їх до складу файлів, що автоматично завантажуються Тепер, коли ми знаємо, якими властивостями володіють об’єкти, що пройшли через трубопровід, перейдемо до розгляду можливих операцій над елементами трубопроводу.
У PowerShell можна чагарникувати об’єкти в трубопроводі, тобто видаляти з конвеєра об’єкти, які не відповідають певній умові. Для цього використовуйте командлет Where-Object, щоб перевірити кожен об’єкт, який проходить через конвеєр, і передати його далі по конвеєру, лише якщо об’єкт відповідає критеріям перевірки.
Сама перевірка в Where-Object може бути організована двома способами: за допомогою блоку коду і через оператори порівняння.
Об’єкти, які проходять через конвеєр, перевіряються в блоці коду, який слідує за іменем командлета Where-Object. Блок сценарію – це одна або кілька команд PowerShell, укладених у фігурні дужки. Виводом блоку коду в командлеті Where-Object має бути логічне значення: $True (true, в цьому випадку об’єкт йде далі по конвеєру) або $Fa 1se (false, в цьому випадку об’єкт не передається далі по конвеєру). Наприклад, можна використовувати такий конвеєр для відображення інформації про зупинені служби в системі (об’єкти, повернуті командлетом Get-Service з властивістю Status з властивістю Stop to Stopped):
PS С:\> Get-Service | Where-Object {$_.Status -eq "Stopped”}
Status Name DisplayName
Stopped Alerter
Stopped AppMgmt
Stopped aspnet_state
Stopped cisvc
Stopped ClipSrv
Оповещатель
Управление приложениями
ASP.NET State Service
Служба индексирования
Сервер папки обмена
Вместо where-object можно использовать его краткие псевдонимы: where или просто символ ?:
PS С:\> Get-Service | where {$_.Status -eq "Stopped”}
PS C:\> Get-Service | ? {$_.Status -eq "Stopped"}
Другой пример: оставим в конвейере только те процессы, у которых значение идентификатора (свойство id) больше 1000:
PS С:\> Get-Process | Where-Object {$_.Id -gt 1000}
Handles NPM (К) РМ(К) WS (К) VM(M) CPU(s) Id ProcessName
158 9 37768 26620 125 28.49 1752 AcroRd32
39 1 364 420 17 0.16 1632 ati2evxx
57 3 1028 804 30 0.40 1988 atiptaxx
24 2 1460 1052 29 0.62 2084 Far
720 75 38516 10508 153 50.96 1756 kavsvc
36 2 728 32 23 0.06 1792 klswd
33 2 792 1984 25 1.15 1412 notepad
242 158 30544 5780 180 7.96 1784 outpost
252 5 34384 27192 137 5.15 2904 powershell
143 5 3252 1028 42 0.31 1528 spoolsv
194 5 2928 1340 59 0.34 1040 svchost
301 14 1784 1316 37 0.80 1116 svchost
1647 65 20820 11548 101 13.21 1152 svchost
55 3 1088 724 27 0.46 1224 svchost
170 6 1568 960 35 0.14 1604 svchost
120 4 2356 1292 35 0.22 1876 svchost
22 2 504 584 23 0.06 1764 winampa
430 13 8472 11352 246 57.63 3216 WINWORD
154 4 2112 2104 38 28.13 2032 wmiprvse
Блоки коду командлета Where-Object використовують спеціальну змінну $ для доступу до поточного об’єкта конвеєра та отримання потрібних властивостей цього об’єкта, які автоматично генеруються PowerShell.
ЗАУВАЖЕННЯ Ця змінна також використовується в інших командлетах, які обробляють елементи конвеєра.
Як видно з прикладів, блок коду використовує спеціальні оператори порівняння. Основні оператори порівняння наведені в табл. 5.1 .
ЗАУВАЖЕННЯ PowerShell не використовує звичайні символи > або < для операторів порівняння, тому що в командному рядку вони означають перенаправлення вводу-виводу.
Таблиця 5.1. Оператори порівняння в оболонці PowerShell
Оператори порівняння можуть бути з’єднані між собою за допомогою логічних операторів (табл. 5.2).
Починаючи з третьої версії, PowerShell підтримує простішу та природнішу мовну версію командлета Where-Obj ect.
Вам не потрібно вказувати блок коду в фігурних дужках і використовувати змінну $ для доступу до об’єкта, який надходить через конвеєр. Все, що вам потрібно зробити, це вказати властивість, за якою потрібно фільтрувати, оператор порівняння, який потрібно використовувати (у цьому випадку це буде параметр командлета Where-Object) та значення, з яким порівнюється властивість об’єкта. Наприклад:
PS С:\Users\andrv> Get-Service | Where-Object -Property Status -eq -Value "Stopped” 98 Часть I. Знакомимся с PowerShell Status Name DisplayName Stopped Alerter Оповещатель Stopped AppMgmt Управление приложениями Stopped aspnet state ASP.NET State Service Stopped cisvc Служба индексирования Stopped ClipSrv Сервер папки обмена Названия параметров -Property И -Value МОЖНО опустить, а вместо Where-Object использовать псевдоним where. В этом случае фильтрация будет выглядеть кратко и выразительно: PS С:\> Get-Service | where Status -eq "Stopped" Status Name Stopped Alerter Stopped AppMgmt Stopped aspnet state Stopped cisvc Stopped ClipSrv DisplayName Оповещатель Управление приложениями ASP.NET State Service Служба индексирования Сервер папки обмена
Сортування елементів конвеєра — ще одна поширена операція, яку виконує командлет Sort-Object (псевдонім сортування). Цей командлет передає імена властивостей, за якими потрібно сортувати об’єкти, що проходять через конвеєр, і повертає дані, упорядковані за значеннями цих властивостей.
Наприклад, ви можете використовувати наступний конвеєр, щоб отримати список процесів, запущених у системі, упорядкованих за часом процесора (властивість sri):
PS С:\> Get-Process | Sort-Object -Property cpu Handles NPM(K) PM(K) WS (K) VM(M) CPU(s) Id ProcessName 0 0 0 16 0 0 Idle 36 2 728 32 23 0.05 1792 klswd 98 5 1104 764 32 0.09 252 alg 21 1 164 60 4 0.09 748 smss 39 1 364 464 17 0.12 1644 ati2evxx 163 6 1536 1404 35 0.12 1612 svchost 55 3 1088 852 27 0.14 1220 svchost 22 2 504' '712 23 0.14 772 winampa 120 4 2364 1228 35 0.26 1876 svchost 193 5 2916 1488 59 0.29 1040 svchost 64 3 812 1080 29 0.30 1252 ctfmon 140 5 3208 1220 41 0.32 1524 spoolsv 281 14 1764 1688 37 0.34 1120 svchost 57 3 1028 996 30 0.39 932 atiptaxx 503 52 7296 3596 51 2.47 836 winlogon 259 6 1432 1340 19 2.48 880 services 341 8 3572 185§ 40 5.36 892 lsass 240 158 29536 10388 175 5.58 1780 outpost 149 4 2940 1108 41 9.29 1248 kav 398 5 36140 26408 137 9.97 1984 powershell 375 12 15020 10456 75 14.03 1116 explorer 376 0 0 36 2 14.97 4 System 409 6 2500 3192 26 20.10 812 csrss 1513 54 13528 9800 95 25.78 1156 svchost 717 75 37432 704 145 56.97 1748 kavsvc 152 4 2372 2716 38 58.09 2028 wmiprvse 307 13 10952 27080 173 9128.03 1200 WINWORD Параметр -Property В КОМаНДЛете Sort-Object используется по умолчанию, поэтому имя этого параметра можно не указывать. Для сортировки в обратном порядке используется параметр -Descending: PS С:\> Get-Process | Sort-Object cpu -Descending Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName 307 13 10956 27040 173 9152.23 1200 WINWORD 152 4 2372 2716 38 59.19 2028 wmiprvse 717 75 37432 1220 145 57.15 1748 kavsvc 1524 54 13528 9800 95 26.13 1156 svchost 410 6 2508 3224 26 20.62 812 csrss 376 0 0 36 2 15.11 4 System 377 13 15020 10464 75 14.20 1116 explorer 374 5 36484 26828 137 10.53 1984 powershell 149 4 2940 1108 41 9.34 1248 kav 240 J 58 29536 10388 175 5.61 1780 outpost 344 8 3572 1856 40 5.40 892 lsass ' 512 53 7324 3608 51 2.51 836 winlogon 259 6 1432 1340 19 2.48 880 services 57 3 1028 996 30 0.39 932 atiptaxx 281 14 1764 1688 37 0.34 1120 svchost 140 5 3208 1220 41 0.32 1524 spoolsv 64 3 812 1080 29 0.30 1252 ct fmon 193 5 2916 1488 59 0.29 1040 svchost 120 4 2364 1228 35 0.26 1876 svchost 22 2 504 712 23 0.15 772 winampa 55 3 1088 852 27 0.14 1220 svchost 39 1 364 464 17 0.13 1644 ati2evxx 163 6 1536 1404 35 0.12 1612 svchost 21 1 164 60 4 0.09 748 smss 98 5 1104 764 32 0.09 252 alg 36 2 728 32 23 0.05 1792 klswd 0 0 0 16 0 0 Idle В рассмотренных нами примерах конвейеры состояли из двух командлетов. Это не обязательное условие, конвейер может объединять и большее количество команд, например: PS C:\> Get-Process | Where-Object Id -gt 1000 | Sort-Object cpu -Descending Handles NPM(K) РМ (К) WS (К) VM(M) CPU(s) Id ProcessName 307 13 10956 27040 173 9152.23 1200 WINWORD 152 4 2372 2716 38 59.19 2028 wmiprvse 717 75 37432 1220 145 57.15 1748 kavsvc 1524 54 13528 9800 95 26.13 1156 svchost 377 13 15020 10464 75 14.20 1116 explorer 374 5 36484 26828 137 10.53 1984 powershell 149 4 2940 1108 41 9.34 1248 kav 240 158 29536 10388 175 5.61 1780 outpost 281 14 1764 1688 37 0.34 1120 svchost 140 5 3208 1220 41 0.32 1524 spoolsv 64 3 812 1080 29 0.30 1252 ct fmon 193 5 2916 1488 59 0.29 1040 svchost 120 4 2364 1228 35 0.26 1876 svchost 55 3 1088 852 27 0.14 1220 svchost 39 1 364 464 17 0.13 1644 ati2evxx 163 6 1536 1404 35 0.12 1612 svchost 36 2 728 32 23 0.05 1792 klswd В результате выполнения последнего конвейера из трех командлетов мы получили упорядоченный по количеству затраченного процессорного времени список процессов, идентификатор которых больше 1000.
PowerShell має командлет під назвою Se1ect-Object (псевдонім se1ect), який дозволяє вибирати задану кількість об’єктів від початку командного рядка до кінця конвеєра, вибирати унікальні об’єкти з конвеєра і виділяти конкретні властивості в об’єктах, які проходять через конвеєр.
Щоб вибрати перший або останній об’єкт з конвеєра, використовуйте параметри -First або -Last командлета Se1ectObject відповідно. Наприклад, наступний конвеєр команд відображатиме інформацію про п’ять останніх процесів, які використовують найбільше пам’яті:
PS C:\> Get-Processt I Sort-Object WS | Select-Object -Last 5 Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName 398 12 14736 8096 78 12.99 740 explorer 1638 66 21368 12292 103 30.03 1152 svchost 280 12 10252 14900 139 124.56 3216 WINWORD 158 9 37776 19704 125 36.21 1752 AcroRd32 297 6 38408 20844 137 8.53 2904 powershell
Давайте розглянемо, як працює цей конвеєр команд. Перший командлет конвеєра (GetProcess) повертає масив об’єктів, які відповідають процесам, запущеним в системі. Другий командлет (Sort-Object) упорядковує конвеєрні об’єкти за значенням властивості ws (обсяг пам’яті, використаної процесом). Нарешті, третій командлет (Se1ect-Object) виділяє останні п’ять елементів із впорядкованого масиву об’єкта.
Припустимо тепер, що ми хочемо отримати список процесів, запущених в системі, в якому були б вказані тільки назви процесів і їх ідентифікатори.
Якщо ми не пам’ятаємо імена потрібних нам властивостей, ми можемо використовувати командлет Get-Member, щоб переглянути структуру об’єктів, повернутих командою Get-Process:
PS С:\> Get-Process | Get-Member -MamberType Property
TypeName: System.Diagnostics.Process
Name MemberType Definition
BasePriority Property System.Int32 BasePriority {get;
Id Property System.Int32 Id {get;}
ProcessName Property System.Strinc[ ProcessName {get;
WorkingSet64 Property„ System.Int64 WorkingSet64 {get;
Итак, В ИТОГОВЫХ объектах нам нужно оставить ТОЛЬКО свойства ProcessName И Id.
Это можно сделать, указав имена нужных свойств в качестве параметров командлета Select-Object:
PS С:\> Get-Process | Select-Object ProcessName, Id
ProcessName Id
AcroRd32 1752
alg 256
102 Часть I. Знакомимся с PowerShell
ati2evxx 1632
atiptaxx 1988
csrss 804
ctfmon 872
explorer 740
Far 2084
Idle 0
kav 884
kavsvc 1756
klswd 1792
lsass 892
outpost 1784
powersftell 2904
Посмотрим теперь, какой тип имеет объект, формируемый в конвейере командлетом select-object, и какие свойства имеются у этого объекта:
PS С:\> Get-Process | Select-Object ProcessName, Id | Get-Member
TypeName: System.Management.Automation.PSCustomObject
Name MemberType Definition
Equals Method
GetHashCode Method
GetType Method
ToString Method
System.Boolean Equals(Object obj)
System.Int32 GetHashCode()
System.Type GetType()
System.String ToString()
Id NoteProperty System.Int32 Id=1752
ProcessName NoteProperty System.String ProcessName=AcroRd32
Як бачимо, об’єкт виводу має тип System. . Автоматизація.
PSCustomObject (нагадаємо, що командлет Get-Process повертав об’єкти типу система. Діагностика. Process) і має лише дві властивості – ProcessName AND Id. Це пов’язано з тим, що під час використання командлета Se1ect-Object для вибору вказаних властивостей він копіює значення цих властивостей із конвеєра до нього та створює нові об’єкти, які містять вказані властивості зі скопійованими значеннями.
На додаток до видалення непотрібних властивостей з об’єктів, командлет Se1ect-Obj ect може також додавати нові обчислювальні властивості. Для цього нову властивість потрібно представити у вигляді хеш-таблиці, де першому елементу (ключу Name) відповідає ім’я додається властивості, а другому елементу (ключу Expression) відповідає значення цієї властивості для поточного елемента конвеєра. Наприклад, результатом наступного конвеєра команд буде масив об’єктів, які мають властивості ProcessNane (ім’я запущеного процесу) і StartMin (хвилина запуску процесу):
PS С:\> Get-Process | Select-Object ProcessName, @ {Name="StartMin”;
Expression = {$_. StartTime. Minute}}
ProcessName StartMin
alg
ati2evxx
atiptaxx
csrss
ctfmon
explorer
45
45
48
45
48
48
Тут обчислюється властивість StartMin, його значення для кожного елемента конвеєра задається блоком коду ( $ . StartTime . Minute}, де змінна $ відповідає поточному об’єкту трубопроводу.
Командлет ForEach-Object дозволяє запускати певний блок коду PowerShell для кожного об’єкта в конвеєрі. Іншими словами, цей командлет можна використовувати для виконання довільних операцій над елементами конвеєра.
Наприклад, давайте розрахуємо загальний обсяг файлів, що зберігаються у вашому домашньому каталозі, шлях до якого зберігається в змінній середовища $NAME. Для цього спочатку зайдіть в цю директорію, оголосіть змінну $Tota 1Length і скиньте її:
PS С:\> cd с:\
PS С:\Users\andrv> $TotalLength=0
Теперь выполним команду dir (напомним, что это псевдоним командлета
Get-chiiditem) и результат ее работы передадим по конвейеру командлету ForEachObject:
PS С:\Users\andrv> dir | ForEach-Object {$TotalLength+=$_.length}
В блоке кода командлета ForEach-Object к текущему значению переменной
$TotaiLength прибавляется значение свойства Length проходящего через конвейер
объекта (размер соответствующего этому объекту файла). В результате в переменной $TotaiLength будет храниться общий размер файлов в байтах:
PS С:\Users\andrv> $TotalLength
17809
Если из объектов, проходящих по конвейеру, нужно лишь извлечь определенное
свойство, то можно просто указать имя этого свойства в качестве параметра
ForEach-Object:
PS C:\Users\andrv> dir | ForEach-Object name
Псевдонимами ДЛЯ командлета ForEach-Object ЯВЛЯЮТСЯ foreach и символ %:
PS C:\Users\andrv> dir | foreach name
PS C:\Users\andrv> dir | % ($TotalLength+=$_. length}
Конвеєрні об’єкти можна згрупувати за значенням певних властивостей за допомогою командлета Group-Object. Об’єкти, які мають однакові значення зазначених властивостей, потраплять в одну групу (властивості можуть бути обчислені).
Давайте розглянемо приклад. Командлет Get-Process генерує об’єкти, які мають властивість Sotrapu (назва компанії, яка є розробником конкретного модуля, який запускається як процес в операційній системі). Згрупуємо ці об’єкти за значенням властивості Sotrap:
PS С:\> Get-Process | Group-Object Company
Count Name Group
1 Adobe Systems Incorpor... {AcroRd32}
13 Microsoft Corporation {alg, ctfmon, lsass, OUTLOOK.
7 {csrss, Idle, kav, kavsvc...)
5 Корпорация Майкрософт {explorer, MAPISP32, scardsvr
1 Eugene Roshal & FAR Group {Far}
2 Intel Corporation {hkcmd, igfxpers}
1 Корпорация Microsoft {jview}
1 Kaspersky Lab {kinagent}
1 Visioneer Inc {OneTouchMon}
1 Hewlett-Packard {sdlaunch}
1 Realtek Semiconductor ... {SOUNDMAN}
Як бачите, у стовпці Count відображається кількість елементів у кожній із груп, а у стовпці Group перелічено елементи, які входять до груп. Якщо потрібно просто дізнатися кількість елементів у групах, можна запустити командлет Group-Object з параметром -NoE1ement:
PS С:\> Get-Process | Group-Object Company -NoElement Count Name 1 Adobe Systems Incorpor... 13 Microsoft Corporation 7 5 Корпорация Майкрософт 1 Eugene Roshal & FAR Group 2 Intel Corporation 1 Корпорация Microsoft 1 Kaspersky Lab 1 1 Visioneer Inc 1 Hewlett-Packard 1 Realtek Semiconductor ...
Іншим корисним командлетом в PowerShell є Measure-Obj ect, який призначений для виконання функцій агрегації (сума, мінімум, максимум або середнє значення) властивостей елемента в конвеєрі об’єктів.
Давайте розглянемо приклад. Раніше ми вже знаходили загальний розмір файлів у нашому домашньому каталозі за допомогою командлета ForEach-Obj ect:
PS С:\Users\andrv> $TotalLength=0 PS C:\Users\andrv> dir | ForEach-Object ($TotalLength+=$_.length} PS C:\Users\andrv> $TotalLength 17809
За допомогою командлета Measure-Object ми також зможемо знайти загальний розмір файлів. Для цього потрібно вказати, що Measure-Object повинен підсумовувати (параметр -sun) значення властивості Length для всіх елементів конвеєра:
PS С: \Users\andrv> dir | Measure-Object -Property Length -Sum Count Average Sum Maximum Minimum Property 5 17809 Length
Результат буде відображатися в полі суми. Для виконання інших операцій потрібно вказати відповідний параметр: -Average, щоб знайти середнє значення, -Minirrun, або знайти мінімальне або максимальне значення відповідно:
PS С:\> dir | Measure-Object -Property Length -Minimum -Maximum -Average -Sum Count : 5 Average Sum : 6433.63636364 : 17809 Maximum : 12458 Minimum : О Property : Length
Командлет “Об’єкт вимірювання” також можна використовувати для отримання статистичної інформації про текстові файли, наприклад, кількості рядків, слів та символів.
Іноді під час роботи з оболонкою PowerShell може знадобитися використовувати методи, визначені в класах (типах) .NET Framework, не створюючи та не використовуючи екземпляри цих класів. Такі класи називаються статичними, тому що вони не створюються, не знищуються і не модифікуються. Зокрема, клас System.Math є статичним, методи якого часто використовуються для математичних обчислень.
Для позначення статичного класу візьміть його назву в квадратні дужки, наприклад:
PS С:\> [System.Math] IsPublic IsSerial Name BaseType True False Math System.Object Для класса [System.Math] в PowerShell определена краткая аббревиатура [math]. PS C:\> [math] IsPublic IsSerial Name BaseType True False Math System.Object
Методи та властивості, визначені в статичному класі, також називаються статичними методами та полями. Для перегляду потрібно передати ім’я потрібного класу (у квадратних дужках) по конвеєру командлету Get-Member з параметром -Static:
PS С:\> [math] | Get-Member -Static
TypeName: System.Math
Name MemberType Definition
Abs Method static System.Single Abs(Single va
Acos Method static System.Double Acos(Double d
Asin Method static System.Double Asin(Double d
Atan Method static System.Double Atan(Double d
Atan2 Method static System.Double Atan2(Double
BigMul Method static System.Int64 BigMul(Int32 a
Ceiling Method static System.Double Ceiling(Doubl
Cos Method static System.Double Cos(Double d)
Cosh Method static System.Double Cosh(Double v
DivRem Method static System.Int32 DivRem(Int32 a .
Equals Method static System.Boolean Equals(Objec .
Exp Method static System.Double Exp(Double d)
Floor Method static System.Double Floor(Double .
IEEERemainder Method static System.Double IEEERemainder.
Log Method static System.Double Log(Double d).
Log 10 Method static System.Double LoglO(Double
Max Method static System.SByte Max(SByte vail.
Min Method static System.SByte Min(SByte vail.
Pow Method static System.Double Pow(Double x, .
ReferenceEquals Method static System.Boolean ReferenceEqu.
Round Method static System.Double Round(Double .
Sign Method static System. Int32 Sign(SByte val.
Sin Method static System.Double Sin(Double a)
Sinh Method static System.Double Sinh(Double v
Sqrt Method static System.Double Sqrt(Double d
Tan Method static System.Double Tan(Double a)
Tanh Method static System.Double Tanh(Double v
Truncate Method static System.Decimal Truncate(Dec.
E Property static System.Double E {get;}
PI Property static System.Double PI {get;}
Як бачимо, методи та поля класу System.Math реалізують різні математичні функції та константи, їх легко розпізнати за назвою. Для доступу до певного статичного методу або властивості використовуються два двокрапки, що йдуть поспіль, а не точка (.), як у звичайних об’єктах. Наприклад, для обчислення квадратного кореня з числа (статичного методу sqrt) і збереження результату змінну використовується наступна конструкція:
PS С:\> $а=[math]::Sqrt(25) PS С:\> $а 5
Статичні методи та поля є у багатьох класів .NET Framework, за їх допомогою, наприклад, можна:
Працювати з рядками (клас [System. String], абревіатура [String]);
Зберігати показання І ВИЧИСЛЮВАТИ дату І час (клас [System. DateTime] з абревіатурою [datetime]);
Розраховувати проміжки часу або різницю між двома показаннями часу (клас [System.TimeSpan] З абревіатурою [timespan]);
Перетворювати значення з одного числового формату на інший (клас [System. Convert ])
PowerShell, як і всі оболонки, використовує механізм конвеєризації команд. Однак в PowerShell конвеєр – це не потік тексту, як у всіх інших оболонках, а об’єкти з властивостями і методами.
Структуру конвеєрних об’єктів можна дізнатися за допомогою командлета Get-Member.
Ви можете виконувати різні маніпуляції з елементами конвеєра: фільтрувати об’єкти за певним критерієм, сортувати і групувати об’єкти, змінювати їх структуру.
Використання конвеєрів об’єктів у PowerShell є прикладом декларативного підходу до програмування. Конвеєри PowerShell використовуються там, де інші мови програмування використовують циклічні та виразні оцінки (імперативний підхід).
PowerShell дає можливість отримати доступ до властивостей та методів статичних класів .NET. Таким чином, можна використовувати багато математичних функцій або функцій, доступних у .NET, для роботи з рядками та датами.
Дякуємо нашій команді волонтерів за надану інформацію з відкритих джерел.