Використання конвеєріву Windows PowerShell

І використання конвеєрів

Акт передачі вихідних даних одного командлета у вхідні дані іншого командлета називається конвеєризацією. Можливо, в інших оболонках вам доводилося використовувати конвеєр. Наприклад, це стандартна команда Cmd. exe :

Тут вихідні дані команди Dir перенаправляються у вхідні дані команди More, що створює посторінкове відображення вихідних даних.

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

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

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

powershell

Команди виконуються в односторонньому порядку – ліворуч, а знак (“”) є розмежувачем між командлетами. Ви вже бачили такі приклади, скажімо, цей:

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

Import-CSV c:\new_users.csv New-ADUser –passThru Enable-ADAccount

використання

Windows PowerShell - це, звичайно, не перша оболонка, в якій використовується технологія конвеєра. В оболонках Unix вже давним-давно інформація від команди до команди передається конвеєром, та й у Windows (зокрема, в Cmd. exe ) використовується щось подібне. Проблема з цими старими оболонками полягала в тому, що вони передавали від однієї команди до іншої не що інше, як текст. Наприклад, уявіть собі, що команда під назвою Plist передає текстовий опис поточного процесу, який виглядає приблизно так:

092 Notepad notepad.exe

098 Windows Paint mspaint.exe

112 Calculator calc.exe

164 Windows PowerShell powersehll.exe

Припустимо, що вашою метою є завершити роботу всіх копій Windows Notepad. У вас є команда під назвою Kill, яка приймає ID (PID) процесу та завершує цей процес. Але ви не можете просто запустити команду:

Для початку ви повинні визначити який рядок вихідних даних Plist відноситься до Notepad; потім вам потрібно скоротити цей рядок до PID, який потрібно команді Kill. У Unix все це здійснюється з використанням утиліт, що аналізують текст, таких як Sed, Grep та Awk. Наприклад, звичайною для Unix є така команда:

ps auxwww grep httpd

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

Windows PowerShell дозволяє відмовитися від текстових вихідних даних на користь іншої форми. Командлет Windows PowerShell завжди виробляє елементи, які є компонентами операційної системи замість тексту.

Windows PowerShell використовує термінологію, яка іноді здається тісно пов'язаною з розробкою програмного забезпечення. Пам'ятайте, що це лише слова, і їх вживання не означає, що вам доведеться стати програмістом, щоб почати користуватися Windows PowerShell. Наприклад, у попередньому розділі ви бачили, що слово "елемент" використовується для позначення того, що командлет відправляє конвеєром. Наприклад, командлет Get-Process поміщає елементи процесу конвеєр. Більше офіційним терміном тут буде слово «об'єкт», тобто. ви можете сказати, що командлет Get-Process вміщує об'єкти процесу в конвеєр.

Ці об'єкти мають атрибути. Для процесу атрибутами може бути ім'я, ID, обсяг пам'яті і.т.д. Формальною назвою атрибуту буде термін «властивість». Іншими словами, ви можете сказати, що об'єкт процесу має властивість імені, властивість ID, і.т.д.

Об'єкти зазвичай мають більше однієї властивості, кожна з яких описує той чи інший атрибут об'єкта. Інші оболонки можуть відображати ці атрибути у вигляді списку або таблиці. Наприклад, об'єкт процесу можна відобразити у вигляді такого тексту:

092 Notepad notepad.exe

098 Windows Paint mspaint.exe

112 Calculator calc.exe

164 Windows PowerShell powershell.exe

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

Властивості об'єктів

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

Наприклад, уявіть, що командлет Get-Service має параметр, який називається computerName. Цей параметр буде уточнювати ім'я віддаленого комп'ютера, з якого ви хочете отримати послуги:

Get-Service –computerName SEA-SRV2

Цей параметр також може бути створений розробником командлета для пошуку властивості Ім'я комп'ютера у вхідного об'єкта. Припустимо, у вас є командлет під назвою Get-ComputerInventory, який отримує список комп'ютерів з конфігураційної бази даних. Кожен комп'ютер у базі даних буде як об'єкт, а кожен об'єкт може мати кілька властивостей, включаючи властивість «Ім'я комп'ютера» (ComputerName). У цьому випадку для вилучення служб з усіх комп'ютерів, що обслуговуються, можна запустити наступну команду:

Немає потреби відображатиінвентаризаційну інформацію як текстової таблиці, піддавати аналізу колонку «Computer Name», тощо, оскільки ви працюєте не з текстом. Windows PowerShell передає об'єкти по конвеєру від одного командлета до іншого та встановлює зв'язок між властивостями об'єкта та параметрами другого командлета.

Насправді командлет Get-ComputerInventory, вбудованого в Windows PowerShell, немає, але командлет Get-Service функціонує саме так, як було описано. Ви побачите приклади його використання трохи згодом.

Іншим дослідницьким командлет PowerShell є командлет Get-Member. Якщо ви помістите об'єкт у конвеєр до нього, то отримаєте список членів класу об'єкта, який включатиме всі властивості об'єкта. Наприклад

Get-EventLog Security -Newest 10 Get-Member

Іншим хорошим шляхом є використання Get-Member разом із командлетом Out-GridView

конвеєріву

Крім командлета Out-Gr командантів Out-. Кожен із них призначений для перенаправлення вихідних даних у конкретне місце:

Out-Host перенаправляє дані у вікно консолі, що є стандартною дією, про яку ви вже чули.

Out-File – виключно корисний командлет; при вказівці імені файлу він перенаправляє дані у цей файл. При цьому об'єкт не форматується, а значить, попередньо слід використовувати один з командлетів, що форматують :

Get-EventLog Application - New 100 Format-List * Out-File events.txt

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

windows

Out-Null – ще одна опція, що має спеціальнепризначення. Іноді командлети перетворюють об'єкти не на те, що вам потрібно. Щоб скасувати ці зміни, використовується командлет Out-Null:

Ви також можете використати старий синтаксис > та >> для перенаправлення об'єкта на файл. В даному випадку командлет Out-File використовується приховано, що спрощує відправлення даних у текстовий файл, хоча при цьому ви втрачаєте можливість застосувати додаткові параметри Out-File:

Якщо ви не знайомі з цим синтаксисом, запам'ятайте, що > відправляє об'єкт у новий файл, замінюючи будь-який існуючий файл з такою ж назвою (Out-File поводиться так само за замовчуванням), а >> додає об'єкт у кінець існуючого об'єкта (як і це робить параметр –append командлета Out-File).

Windows PowerShell передає об'єкти по конвеєру до кінця. На кінці конвеєра об'єкти, що залишилися, передаються в спеціальний командлет, який називається Out-Default. Його не потрібно прописувати вручну, оскільки він уже вбудований у конвеєр. Його робота полягає в тому, щоб прийняти об'єкти, що вийшли, і передати їх на консольний командлет Out-Host, який відображає вихідні дані на екрані в текстовому вигляді. Оскільки об'єкти не конвертуються в текст до кінця конвеєра, ви маєте доступ до їх властивостей до кінця. Це означає можливість створювати складні команди без потреби в текстовому аналізі.

Це загальне правило має два винятки:

  • Командлети Format-виробляють об'єкти, але ці об'єкти є вкрай специфічними – їх «розуміють» лише командлети Out-. Це означає, що Format-командлет повинен бути або останнім у конвеєрі, або передостаннім (перед командлетом Out-).
  • Більшість командлетів Out-не виробляють жодних об'єктів; вони лише відправляютьоб'єкти (наприклад, текст) на пристрій (файл, принтер або вікно консолі). Тому, командлети Out- слід розташовувати наприкінці конвеєра.

powershell

Багато в чому потужність і гнучкість Windows PowerShell пов'язані з можливістю передавати об'єкти від одного командлета до іншого конвеєром. Оскільки ці командні рядки – навіть дуже довгі – є лише одним логічним ланцюжком тексту всередині оболонки, їх часто називають однолінійниками (one-liners). У більшості випадків один такий однолінійник може виконати ті ж завдання, для вирішення яких знадобилося б безліч рядків, написаних скриптовою мовою в рамках будь-якої їх старих технологій, наприклад, Visual Basic Scripting Edition (VBScript). Наприклад, цей однолінійник з використанням технік, які ми розглянемо пізніше, поєднує всі імена комп'ютерів, перерахованих у c:\computers.txt і навіть створює звіт про розмір журналу реєстрації подій:

Get-Content c:\computers.txt where foreach

Get-WmiObject Win32_NTEventLogFile -computer $_.Trim() `

-filter "NumberOfRecords > 0" Select-Object `

> Sort Computername Format-Table -GroupBy Computername `

Звичайно, це складна команда, але вона чудово ілюструє міць та гнучкість конвеєра.

Коли ви почнете працювати з Windows PowerShell, основною причиною помилок і труднощів можуть стати припущення про імена властивостей або значень, які вони містять. Наприклад, якщо ви припустите, що існує властивість з ім'ям DriveLetter, тоді як насправді його ім'я – Device & gt; ».