Виведення інформації про успішне виконання команди PowerShell. Out-Null або придушення виведення інформації у Windows PowerShell. Написання та запуск скриптів

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

створення

Уявимо, що щоранку ви перевіряєте 50 останніх логів за 14 годин журналу Application за допомогою цієї команди:

Get-EventLog -LogName Application -Newest 50 | where TimeWritten -ge (Get-Date).AddHours(-14)

Команда не дуже складна, але незабаром її набридне писати. Для скорочення цієї роботи її можна виділити в окрему функцію:

Function Get-DayLog ( Get-EventLog -LogName Application -Newest 50 | where TimeWritten -ge (Get-Date).AddHours(-14) )

Будь-яка функція обов'язково має складатися із трьох речей:

  • function - оголошує та каже що після неї буде назва;
  • Ім'я функції - назва, за якою ми її викликатимемо. У разі ім'я Get-DayLog;
  • дужки - позначають початок та кінець виразу.

Після написання функції вона викликається на ім'я:

Get-DayLog

Враховуючи, що нам може знадобитися отримати дані не за останні 14 годин і більше ніж за 50 днів, нам може знадобитися змінити її передавши параметри.

Найменування

Не обов'язково використовувати ім'я такого ж плану, як заведено в Powershell, тобто замість "Get-DayLog" можна писати "daylog". Такий підхід рекомендується і є поширеною практикою, яка допоможе відрізнити запуск сторонньої програми від функції.

Функції Powershell завжди іменуються за такою ознакою. Перше слово це дієслова типу:

  • Get – отримати;
  • Set – змінити;
  • Install – встановити;
  • New – створити.

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

Передача параметрів

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

Function Get-DayLog ($param1,$param2) ( Get-EventLog -LogName Application -Newest $param1 | where TimeWritten -ge (Get-Date).AddHours($param2) )

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

Тепер, щоб викликати функцію, потрібно передавати два параметри:

Get-DayLog -param1 50 -param2 -14

При викликі функції ми надаємо два обов'язкові параметри зі значеннями. Ці значення, всередині функції, будуть доступні під назвою $param1 та $param2. Ці змінні ми передаємо до команди отримання та фільтрації логів.

Встановлення значень за замовчуванням

У нашій задачі, найчастіше, ми отримуємо лише 50 останніх ліг і нам не хочеться вказувати їх щоразу. Якщо ми не вказуватимемо цей параметр у існуючій функції, то отримаємо помилку. Щоб цього уникнути, потрібно вказати значення за замовчуванням. На прикладі нижче я надав $param1 значення 50. Воно буде використовуватися тільки в тому випадку, якщо ми не використовуємо цей параметр під час виклику:

Function Get-DayLog ($param1=50,$param2) ( Get-EventLog -LogName Application -Newest $param1 | where TimeWritten -ge (Get-Date).

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

Function Get-DayLog ($param2,$param1=50) ( Get-EventLog -LogName Application -Newest $param1 | where TimeWritten -ge (Get-Date).AddHours($param2) ) Get-DayLog -7 1 Get-DayLog -7

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

Повернення значень

На відміну від інших мов, якщо ми надамо змінній $result результат функції Get-DayLog, то вона міститиме значення:

$result = Get-DayLog -7 1

Це буде працювати до тих пір, поки ми не вирішимо змінити функцію надавши змінні:

Function Get-DayLog ($param2,$param1=50) ( $events = Get-EventLog -LogName Application -Newest $param1 | where TimeWritten -ge (Get-Date).AddHours($param2) ) $result = Get-DayLog -7 $result $events

Ми не можемо отримати результат використовуючи змінну $result, тому що функція не виводить інформацію, а зберігає її в змінній $events. Викликаючи $events ми теж отримуємо інформацію, оскільки тут працює поняття " область видимості змінних " .

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

Function Get-DayLog ($param2,$param1=50) ( $events = Get-EventLog -LogName Application -Newest $param1 | where TimeWritten -ge (Get-Date).AddHours($param2) return $events ) $result = Get-DayLog -7 $result

Я рекомендував би завжди повертати значення через return, а не використовувати висновок використовуючи команди типу Write-Output всередині функції. Використання return зупиняє роботу функції та повертає значення, а це означає, що його не варто ставити по середині логіки якщо так не планувалося.

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

Function Get-Salary ($Zarplata) ($nalog = $Zarplata * 0.13 $zarplata_bez_nds = $Zarplata - $nalog return $nalog,$zarplata_bez_nds ) Get-Salary -Zarplata 100000

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

У випадку з масивами, що додасть напис про зарплату, і податок потрібно використовувати індекси:

$result = Get-Salary -Zarplata 100000 # Визначаємо тип даних $result.GetType() Write-Host "це зарплата" $result Write-Host "це податок" $result

Повертатися може будь-який тип даних. Наприклад, ми можемо використовувати інший тип даних хеш таблиці, які на відміну від масивів іменовані:

Function Get-Salary ($Zarplata) ($nalog = $Zarplata * 0.13 $zarplata_bez_nds = $Zarplata - $nalog return @("Податок"=$nalog;"Зарплата"=$zarplata_bez_nds;) ) Get-Salary -Zarplata 100

Використання масивів

Передача масивів як параметрів

У попередніх статтях було багато прикладів по роботі з масивами та хеш таблицями. Їх, як і будь-який інший тип даних, ми можемо передавати у функцію. Для прикладу, всі команди Powershell, які мають ключ ComputerName, можуть виконуватися віддалено. Більшість таких команд можуть набувати значень масиви, тобто нам не обов'язково передавати по черзі імена комп'ютерів.

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

Function Get-ServiceStopped ($Computers)( $services = Get-Service -ComputerName $Computers | where Status -eq Stopped return $services ) Get-ServiceStopped "127.0.0.1","localhost"

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

Function Get-ServiceStopped ($Computers)( $services = Get-Service -ComputerName $Computers | where Status -eq $Computers[-1] return $services ) Get-ServiceStopped "127.0.0.1","localhost","Stopped"

Хеш таблиці

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

Function Get-ServiceStopped ($Params)( $services = Get-Service @Params | where Status -eq Stopped $services = Start-Service $services return $services ) Get-ServiceStopped @(Name="WinRM";ComputerName=@( "127.0.0.1", "localhost"))

Знак @ у команді повідомляє, що дані хеш таблиці будуть використовуватися як параметри команди. Важливо, щоб їхні імена відповідали цим параметрам.

Умови

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

Нижче наведено приклад, де в залежності від швидкості завантаження основної частини сайту буде повернена різна відповідь. Якщо швидкість відповіді менша за 76 мілісекунд нормальна, у разі якщо довшої відповіді повернеться інший результат:

Function Get-SiteResponse ( # Початок відліку $start_time = Get-Date # Виконання запиту $request = Invoke-WebRequest -Uri "https://сайт" # Фіксування закінчення виконання $end_time = Get-Date # Обчислюємо різницю в часі $result = $end_time - $start_time # Перевірка та повернення результату if ($result.Milliseconds -lt 76) ( return "Швидкість відповіді нормальна " + $result.Milliseconds) else( return "Сайт відповідає довго " + $result.Milliseconds ) ) Get- SiteResponse

Switch

Ми вже говорили про у попередніх статтях. Якщо коротко, то це зручніші умови. Використовуючи попередній приклад, але зі Switch, це виглядатиме так:

Function Get-SiteResponse ( # Початок відліку $start_time = Get-Date # Виконання запиту $request = Invoke-WebRequest -Uri "https://сайт" # Фіксування закінчення виконання $end_time = Get-Date # Обчислюємо різницю в часі $result = $end_time - $start_time # Перевірка та повернення результату switch($result.Milliseconds) ( ($PSItem -le 76) ( return "Швидкість відповіді нормальна " + $result.Milliseconds) default ( return "Сайт відповідає довго " + $result.) Milliseconds ) ) ) Get-SiteResponse

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

Function Install-SQLUpdates (# робимо установку return "Установка оновлень на SQL сервер пройшла успішно") function Install-ADUpdates (# на файловий серверпройшла успішно" ) function Make-Switch ($computer) ( # Перевірка імені комп'ютера $result = switch($computer)( ($computer -like "SQL*") (Install-SqlUpdates) ($computer -like "AD*" ) (Install-ADUpdates) ($computer -like "FileServer*") (Install-FileServerUpdates) default ("Такого типу комп'ютерів немає") ) return $result ) Make-Switch "AD1"

Зі switch так само зручно передавати булеви значення. У прикладі нижче якщо вказано ключ -On сервіс увімкнеться, а якщо його немає вимкнеться:

Function Switch-ServiceTest ($on) ( if ($on) (Write-Output "Сервіс увімкнено") else ("Сервіс вимкнено") ) Switch-ServiceTest -On Switch-ServiceTest

Передача через конвеєр або Pipeline

Ви, напевно, працювали через команди Powershell, які дозволяли використовувати конвеєр таким чином:

Get-Process -Name * TestProc * | Stop-Process

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

Function Get-SomeNum ( # Генерація числа $num = Get-Random -Minimum 5 -Maximum 10 return $num ) Function Plus-SomeNum ($num) ( Write-Host "Додавання числа " $num $num += $num return $ num ) Get-SomeNum Plus-SomeNum 5 Get-SomeNum | Plus-SomeNum

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

Get-Help Stop-Process -Parameter Name

Таких атрибутів лише два:

  • ValueFromPipelineByPropertyName- Отримання значення з конвеєра на ім'я;
  • ValueFromPipeline- Отримання через конвеєр тільки значення.

Крім цього, всередині нашої функції ми повинні додати спеціальний блок Process. Наш скрипт у результаті виглядатиме так:

Function Get-SomeNum ( $num = Get-Random -Minimum 5 -Maximum 10 return $num ) function Plus-SomeNum ( Param ( $num) process ( Write-Host "Додаток числа " $num $num += $num return $ num)) 1..5 | Plus-SomeNum Get-SomeNum | Plus-SomeNum

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

Якби ми не вказали блок Process функція би повернула тільки останній результат з масиву 1..5:

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

Function Get-SomeNum ( $num = Get-Random -Minimum 5 -Maximum 10 $object = @(num=$num) return $object ) Function Plus-SomeNum ( Param ( $num) process ( Write-Host "Додаток числа " $num $num += $num return $num ) ) Get-SomeNum | Plus-SomeNum @ (num = 5) | Plus-SomeNum @ (bad = 5) | Plus-SomeNum

Як уже писалося ValueFromPipelineByPropertyName приймає лише іменовані параметри і у випадку з ім'ям "bad" ми отримуємо помилку:

  • Не вдається прив'язати об'єкт введення до будь-яких параметрів команди, оскільки команда не приймає вхідних даних конвеєра
  • Вхідний об'єкт не може бути рівним до будь-яких параметрів для команди будь-якої команди, щоб не дати піплайну введення або введення і його properties до не match any of parametrів, які встановлюють шрифт.

Причому передавати іменовані параметри через хеш таблиці ми можемо, лише через pscustomobject.

Ви можете вказувати відразу два атрибути таким чином:

Це дозволить використовувати значення з ім'ям, якщо воно зазначено або без нього. Це не врятує вас від ситуації, якщо ви передаєте параметр з іншим ім'ям:

Передача через конвеєр кількох значень

Наприклад розглянемо ситуацію, де нам потрібно передати через конвеєр два значення. Якщо Get-SomeNum повертатиме масив, то через конвеєр у нас проходитиме кожне число окремо. Це ще один привід використати іменовані параметри:

Function Get-SomeNum ( $number1 = Get-Random -Minimum 5 -Maximum 10 $number2 = Get-Random -Minimum 1 -Maximum 5 $object = @(num1=$number1;num2=$number2) return $object ) function Plus -SomeNum ( Param ( $num1, $num2) begin ($num1 += $num1 $num2 = $num2 * $num2) process ( return @("Результат складання"=$num1; "Результат множення"=$num2) ) ) Get-SomeNum | Plus-SomeNum

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

Насправді PowerShell має базу даних (набір XML-файлів), що містить модулі форматування за умовчанням для різних типів.NET-об'єктів. Ці модулі визначають, які властивості об'єкта відображаються під час виведення та у якому форматі: списку чи таблиці. Коли об'єкт досягає кінця конвеєра, PowerShell визначає його тип та шукає його у списку об'єктів, для яких визначено правило форматування. Якщо цей тип у списку виявлено, то об'єкт застосовується відповідний модуль форматування; якщо ні, то PowerShell просто відображає властивості цього об'єкта.

Також у PowerShell можна явно задавати правила форматування даних, що виводяться командлетами, і подібно до командного інтерпретатора Cmd.exe перенаправляти ці дані у файл, на принтер або в порожній пристрій.

Форматування інформації, що виводиться

У традиційних оболонках команди та утиліти самі форматують дані, що виводяться. Деякі команди (наприклад, dir в інтерпретаторі Cmd.exe) дозволяють настроювати формат виведення за допомогою спеціальних параметрів.

В оболонці PowerShell висновок форматують лише чотири спеціальні командлети Format (табл. 17.3). Це спрощує вивчення, тому що не потрібно запам'ятовувати засоби та параметри форматування для інших команд (інші командлети виведення не форматують).

Таблиця 17.3. Командлети PowerShell для форматування виводу
Командлет Опис
Format-Table Форматує виведення команди у вигляді таблиці, стовпці якої містять властивості об'єкта (також можуть бути додані стовпці, що обчислюються). Підтримується можливість групування даних, що виводяться
Format-List Висновок форматується як список властивостей, у якому кожна властивість відображається на новому рядку. Підтримується можливість групування даних, що виводяться
Format-Custom Для форматування виводу використовується уявлення користувача (view)
Format-Wide Форматує об'єкти у вигляді широкої таблиці, в якій відображається лише одна властивість кожного об'єкта

Як вже зазначалося вище, якщо жоден із командлетів Format явно не вказаний, то використовується модуль форматування за умовчанням, який визначається за типом даних, що відображаються. Наприклад, при виконанні командлета Get-Service дані за замовчуванням виводяться як таблиця з трьома стовпцями (Status, Name та DisplayName):

PS C:\> Get-Service Status Name DisplayName ------ ---- ----------- Stopped Alerter Оповіщувач Running ALG Служба шлюзу рівня програми Stopped AppMgmt Управління програмами Stopped aspnet_state ASP.NET State Service Running Ati HotKey Poller Ati HotKey Poller Running AudioSrv Windows Audio Running BITS Фонова інтелектуальна служба пере... Running Browser Оглядач комп'ютерів Stopped cisvc Служба індексування Stopped ClipSrv Сервер папки обміну Stopped clr_optimiza COMSysApp Системна програма COM+ Running CryptSvc Служби криптографії Running DcomLaunch Запуск серверних процесів DCOM Running Dhcp DHCP-клієнт...

Для зміни формату даних, що виводяться, потрібно направити їх по конвеєру відповідному командлету Format . Наприклад, наступна команда виведе список служб за допомогою командлета Format-List :

PS C: Get-Service | Format-List Name: Alerter DisplayName: Оповіщувач Status: Stopped DependentServices: () ServicesDependedOn: (LanmanWorkstation) CanPauseAndContinue: False CanShutdown: False CanStop: False ServiceType: Win32ShareProcess Name: pendedOn : () CanPauseAndContinue: False CanShutdown: False CanStop: True ServiceType: Win32OwnProcess . . .

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

При форматуванні виводу за допомогою командлетів Format-List та Format-Table можна вказувати імена властивості об'єкта, які мають бути відображені (нагадаємо, що переглянути список властивостей, що є у об'єкта, дозволяє розглянутий раніше командлет Get-Member ). Наприклад:

PS C: Get-Service | Format-List Name, Status, CanStop Name: Alerter Status: Stopped CanStop: False Name: ALG Status: Running CanStop: True Name: AppMgmt Status: Stopped CanStop: False . . .

Вивести всі наявні об'єкти властивості можна за допомогою параметра * , наприклад:

PS C: Get-Service | Format-table *

Перенаправлення інформації, що виводиться

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

PS C: Get-Command out-* | Format-Table Name Name ---- Out-Default Out-File Out-Host Out-Null Out-Printer Out-String

За замовчуванням інформація, що виводиться, передається командлету Out-Default , який, у свою чергу, делегує всю роботу з виведення рядків на екран командлету Out-Host . Для розуміння цього механізму слід враховувати, що архітектура PowerShell має на увазі різницю між власне ядром оболонки (інтерпретатором команд) і головним додатком (host), який використовує це ядро. В принципі, як головне може виступати будь-яка програма, в якій реалізовано ряд спеціальних інтерфейсів, що дозволяють коректно інтерпретувати інформацію, що отримується від PowerShell. У нашому випадку головним додатком є ​​консольне вікно, в якому ми працюємо з оболонкою, і командлет Out-Host передає інформацію, що виводиться в це консольне вікно.

Параметр Paging командлета Out-Host , подібно до команди more інтерпретатора Cmd.exe, дозволяє організувати посторінковий висновок інформації, наприклад:

Get-Help Get-Process-Full | Out-Host -Paging

Збереження даних у файл

Командлет Out-File дозволяє направити дані, що виводяться замість вікна консолі в текстовий файл. Аналогічне завданнявирішує оператор перенаправлення (>), проте командлет Out-File має кілька додаткових параметрів, за допомогою яких можна гнучкіше управляти висновком: задавати тип кодування файлу (параметр Encoding), задавати довжину рядків, що виводяться в знаках (параметр Width), вибирати режим перезапису файлу (параметри Append, noClobber). Наприклад, наступна команда направить інформацію про зареєстровані на комп'ютері служби у файл C:\service.txt, причому даний файлбуде записано у форматі ASCII.

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

PowerShell пропонує як суто консольний інтерфейс, так і повноцінне середовище розробки PowerShell ISE(Integrated Scripting Environment, вбудоване скриптове оточення) для скриптів. Для запуску інтерфейсу командного рядка введіть powershell у меню "Виконати" (WinKey + R). PowerShell ISE запускається за допомогою команди PowerShell ISE в тому ж меню.

ISE більш переважно, оскільки надає ширші можливості розробнику завдяки підсвічуванням синтаксису, функції автозаповнення коду та іншим особливостям, властивим багатьом «великим» IDE.

Написання та запуск скриптів

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

Також існують системні політики, що обмежують виконання скриптів. Можна перевірити поточні параметри політики, ввівши команду Get-ExecutionPolicy . Результатом буде одне з наступних значень:

  • Restricted- Виконання скриптів заборонено. Стандартна конфігурація;
  • AllSigned- можна запускати скрипти, підписані довіреним розробником; перед запуском скрипта PowerShell запросить у вас підтвердження;
  • RemoteSigned- Можна запускати власні скрипти або підписані довіреним розробником;
  • Unrestricted- Можна запускати будь-які скрипти.

Для початку роботи необхідно змінити налаштування політики запуску на RemoteSigned, використовуючи команду Set-ExecutionPolicy:

Командлети

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

  • існують системні, користувальницькі та опціональні командлети;
  • результатом виконання командлета буде об'єкт чи масив об'єктів;
  • командлети можуть обробляти дані та передавати їх іншим командлетам за допомогою конвеєрів;
  • командлети нечутливі до регістру, тому немає різниці між Get-ADUser , get-aduser і gEt-AdUsEr ;
  • як роздільник використовується символ; .

Кожен командлет містить у собі дієслово та іменник, що поділяються дефісом. Наприклад:

  • Get-Process- Відобразити поточні процеси, запущені на комп'ютері;
  • Get-Service- відобразити список служб та їх статус;
  • Get-Content- Відобразити вміст вказаного файлу, наприклад Get-Content C:\Windows\System32\drivers\etc\hosts .

При необхідності список усіх доступних командлетів можна вивести за допомогою Get-Help-Category:

Також можна створювати свої власні командлети.

Параметри

Кожен командлет має кілька параметрів, що визначають його роботу. PowerShell ISE автоматично пропонує всі доступні параметри з відображенням їх типу. Наприклад, Get-Service-NameW* виводить список служб, у яких ім'я починається з W . Якщо ви забули, які параметри у введеного командлета, скористайтесь Get-Member . Наприклад, Get-Process | Get-Member:

Якщо ви не знайшли того, що потрібно, або не впевнені, як правильно задаються параметри, можна навіть запитати приклади за допомогою параметра -Examples:

Деякі командлети можуть викликатися за допомогою аліасів, наприклад замість Get-Help можна просто написати Help .

При написанні великих скриптів або колективної розробки можна скористатися коментарями. Кожен коментар починається з символу #, а блок коментарів обмежується комбінаціями символів<# и #>на початку та наприкінці відповідно.

Конвеєр

PowerShellдозволяє здійснювати обмін даними між командлетами з допомогою конвеєра. Наприклад:

  • GetService | SortObject -property Status - сортування запущених служб за статусом;
  • "Hello World!" | Out-File C:\ps\test.txt - запис тексту у файл.

Можна використовувати кілька конвеєрів. Наприклад, наступний скрипт виводить список імен усіх служб за винятком зупинених:

Get-Service | WHERE ($_.status -eq "Running") | SELECT displayname

Висновок

Отже, завдяки цьому посібнику у новачків з'явилося уявлення про те, що собою являє PowerShell. Також ми розглянули варіанти зміни політики виконання скриптів, що таке командлет, як обмінюються даними за допомогою конвеєра і як отримати властивості потрібного об'єкта. Пам'ятайте, що у разі труднощів можна скористатися командлет Get-Help.

Ця стаття є текстовою версією уроку з нашого безкоштовного відеокурсу PowerShell та Основи Active Directory (для отримання повного доступу використовуйте секретне слово «blog»).

Даний відеокурс виявився надзвичайно популярним по всьому світу і він проведе вас по всіх щаблях для створення повного набору інструментів управління службою каталогів Active Directoryпочинаючи з самих азів.

Кодування за допомогою PowerShell

Спочатку це може здатися складним завданням почати працювати з PowerShell, особливо якщо з роками ви вже звикли працювати з командним рядком cmd.exe і так званими батниками (файлі з розширеннями.bat і.cmd). У цій статті, написаній за матеріалами 2-го уроку нашого відеокурсу, ми розповімо, як і чому вам варто оновити свої навички роботи з PowerShell, а також розберемо основи запуску редактора PowerShell, освоїмо авто-завершення команд і як у будь-якій скрутній ситуації отримати актуальну допомога та приклади.

Виконання Команд

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

Якщо ви працюєте в будь-якій організації, яка при цьому існує не один день, то у вас вже напевно є кілька маленьких скриптів на кожен день, які ви запускаєте з командного рядка cmd.exe. І це чудова новина! Отже, ви так само легко зможете виконувати все це і з PowerShell. Це було справді мудре дизайнерське рішення з боку Microsoft, так вони зробили перехід на нове рішення легшим для адміністраторів.

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

Всі ваші часто використовувані утиліти, такі як ping, ipconfig, nslookup, тощо будуть працювати саме так, як ви очікуєте.

Як знайти команди PowerShell

Люди люблять PowerShell, тому що це так, ну потужно! Але ця сила походить від абсолютно шаленої кількості вбудованих можливостей. Це просто не можливо, та напевно і не практично, щоб хтось запам'ятав усілякі команди, командлети, прапори, фільтри та інші способи сказати PowerShell, що і як зробити.

На щастя, прямо в редакторі вбудовано кілька інструментів, щоб допомогти вам упоратися з цим.

Авто-завершення команд із натискання Tab

Немає необхідності запам'ятовувати різні команди чи точне написання команди. Наберіть

Get-c
Тепер натискаючи клавішу Tab – ви зможете перебрати всі доступні команди, що починаються з тих символів, що ви вже ввели. Причому це працює у будь-якій частині тіла команди, на яку ви намагаєтеся послатися: в іменах та прапорах команд і навіть при автозавершенні повних шляхів на файловій системі.

Команда Get-Command

Незважаючи на те, що автодоповнення Tab працює чудово, що відбудеться, якщо Ви не знаєте правильне ім'я команди, яка вам потрібна? У цьому випадку можна використовувати команду, щоб знайти інші доступні команди: Get-Command.

У пошуку імені команди, важливо мати на увазі, що є синтаксис для них: Дієслово-Іменник. Як правило, Дієслова такі як – Get (Отримати), Set (Встановити), Add (Додати), Clear (Очистити), Read (Читати) та Write (Писати) та Іменники – файли, сервери або інші сутності у вашій мережі та додатках .

Get-Command– це інструмент для пошуку та вивчення команд, доступних на вашому комп'ютері.

Синтаксис команд PowerShell

Хтось колись описав мову скриптів Perl, як "шум з виконуваних рядків коду" (ориг. "executable line noise") - неймовірно корисний інструмент, з дико непрозорим синтаксисом і відповідно з високим порогом для його вивчення.

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

CMD: FOR /D /R %G IN (“Foo*”) DO @ECHO %G
FOR та DO вказують на те, що це цикл.
Прапор /D вказує, що це цикл з усіх папок
Прапор /R вказує, що потрібно включати всі файли та папки, включаючи підкаталоги
Шаблон пошуку, який визначає цікавий для нас набір файлів, позначається за допомогою “IN”
ECHO показує, що сценарій повинен вивести на екран результат кожного циклу і, нарешті,
%G – це “вимушений параметр” і обраний тому, що раніше програмісти Microsoft вже використовували при розробці літери A, D, F, N, P, S, T, X. Тому, починати з G, є хорошим тоном, т.е. до. це дає вам самий великий набірневикористаних літер для форматів шляхів повернутих змінних (G, H, I, J, K, L, M) – іншими словами, це лайфхак.

Порівняйте тепер еквівалент PowerShell:

PowerShell: Get-ChildItem -Path C:\ -Filter 'Foo*'
Результат – той самий, але навіть на такому досить тривіальному прикладі буде набагато легше зрозуміти, що відбувається. Відразу стає очевидним, що робить кожен елемент у команді і як можна їх змінити. Ну хіба що підстановковий знак '*' використовується в обох прикладах, але я думаю що ви і так чудово знаєте, що він означає - що всі елементи повинні починатися з 'Foo' і в кінці ще щось.

Відчуваєте, як ваш настрій поступово покращується? А тепер, якщо ви захочете дізнатися, як вибрати тільки файли (а не папки) в дорозі? Ви можете покопатися в мануалах, або ваш кращий друг Google вам допоможе або може спробувати розібратися з командного рядка? Маленька підказка: якщо ви знаходитесь у PowerShell, введіть “-” і натисніть клавішу Tab, пройдіться по потрібних прапорах, доки очевидне рішення не з'явиться.

Одна Довга Рядок проти Об'єкту

Сайти нікому не потрібні, якщо вони не в Інтернеті. Саме тому люди витрачають величезну кількість часу, вдаючи, що вони оператори сонара на підводному човні і «пінгують» доступність своїх серверів (так-так, саме тому він так називається).

Незважаючи на те, що виведення команди Ping корисний (і ви можете використовувати ping з тим же успіхом і в консолі PowerShell), врешті-решт це просто великий і довгий рядок – ряд літер та цифр з деякими перервами між ними.

PowerShell має команду, яка схожа на Ping, але повертає дані в структурованому вигляді. Це команда Test-Connection.

Нижче наведено результат роботи цієї команди з обміну пакетами з сервером DC у зовсім іншому повністю структурованому вигляді:

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

Вбудована допомога

До цього моменту ми були зосереджені на виконанні певних команд, використовуючи додаток по Tab, але як тільки ви почнете працювати з PowerShell, все більше і більше команди стають все більш складними з ще більш складними параметрами. У той час як синтаксис Дієслово-Іменник (Verb-Noun) допомагає, але ще більше допомагає наявність під рукою:

1. Актуальної документації
2. Велика кількість прикладів

Допомогти Командлетам

На практиці слід комбінувати команду Get-Command (щоб знайти те, що слід використовувати), а потім використовувати Get-Help, щоб дізнатися, як користуватися цією конкретною командою.

Практичний приклад, як це зробити: припустимо, вам потрібно визначити, чи всі запущені служби Windowsна комп'ютері.

Для початку можна пошукати команди для взаємодії зі службами:

Get-Command service
Яка повідомить вас відразу, що ви на правильному шляху. Обмірковуючи повернутися до стандартного синтаксису команд PowerShell Дієслово-Іменник, ви б хотіли з'ясувати, як правильно використовувати команду 'Get-Service'.

Документація Microsoft за командою Get-Service
Для цього варто використовувати команду Get-Help. Почніть друкувати
“Get-Help -” та натисніть клавішу Tab
Ви швидко виявите доступні опції, найбільш явно підходить один "Name", так що варто спробувати:

Get-Help -Name Get-Service
Ви отримаєте повний синтаксис команди (і що з опцій ви можете включити або виключити на базі фільтрів).

Якщо ви захочете дослідити команду глибше і деталізувати її до кожного параметра, то наберіть:

Get-Help -Name Get-Service - Parameter Name

Допомога з прикладами PowerShell

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

Ввівши "-examples" або додавши прапорець "-detail" до команди "Get-Help", вам буде надано набір прикладів для використання команди.
Ось, наприклад, висновок для команди:

Get-Help -Name Get-Service -Examples

Залишаючись у курсі

Що може бути жахливішим, ніж непрацюючий приклад, або приклад з помилкою в документації. Часто це буває або через застарілу документацію, або через невірні приклади або через оновлені бібліотеки.

Щоб обійти ці проблеми та заодно отримати нові приклади та виправлення, введіть:

Update-help
і розпочнеться процес завантаження оновленої контекстної допомоги.

Ви можете допомогти і переказати трохи коштів на розвиток сайту

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

Команди PowerShell, які допоможуть користувачеві зробити більше

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

Ми Роздивимось командлети, які можуть виконувати такі дії:

  1. Запустіть програму UWP.
  2. Отримати довідку про будь-якого командлету.
  3. Отримайте схожі команди.
  4. Знайти певний файл.
  5. Прочитайте вміст файлу.
  6. Знайти інформацію про всі послуги на комп'ютері.
  7. Знайти інформацію про всі процеси на комп'ютері.
  8. Встановлення політики виконання.
  9. Скопіюйте файл або каталог.
  10. Видалити файл або каталог.

1] Запустіть програму UWP

PowerShell – чудовий інструмент, який можна використовувати для запуску додатків UWPза лічені секунди. Але головне полягає у правильному виконанні команди. Ти можеш використати

Start-Process "ms-settings:"

Команда просто для запуску програми WindowsУстановки UWP. Ви можете дізнатися більше про інші URI для інших програм UWP тут на microsoft.com.

2] Отримайте довідку про будь-який командлет

Якщо ви ніколи не розумієте, яку команду ви повинні використовувати для виконання певного завдання. Або те, що робить конкретний командлет вам не потрібно турбуватися. Ви можете просто використовувати командлет Get-Help, щоб зробити це. Ви можете використовувати його такими способами:

Get-Help Отримати допомогу Get-Help -Full Get-Help -Example Get-Help *

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

3] Отримати схожі команди

Щоб знайти команди аналогічного типуабо які містять у собі певну фразу, ви можете використовувати командлет Get-Command. Однак у ньому не перераховано кожен командлет PowerShell, тому ви використовуєте деякі конкретні фільтри. Ви можете використовувати такі команди:

Get-Command -Name Get-Command -CommandType

Перший командлет допоможе вам знайти командлет із певною фразою, а другий – відфільтрувати командлети, які виконують певну функцію.

4] Пошук певного файлу

Якщо вам потрібно знайти певний файл або каталог у певному місці, ви можете використати командлет Get-Item. Ви можете використовувати його як

Get-Item

перерахувати вміст конкретного шляху.

5] Прочитайте вміст файлу

Get-Content

6] Прочитайте інформацію про всі служби на комп'ютері.

Ви можете використовувати командлет Get-Service, щоб перерахувати всі служби, запущені або зупинені на вашому комп'ютері. Крім того, ви можете використовувати наступні командлети для виконання відповідних функцій:

Start-Service Стоп-Service Suspend-Service Resume-Service Рестарт-Сервіс

7] Читайте інформацію про всі процеси на комп'ютері

Подібно до командлету Get-Service, ви можете використовувати командлет Get-Process, щоб вивести список всіх процесів, запущених на вашому комп'ютері. Як альтернативу ви можете використовувати наступні командлети для виконання відповідних функцій:

Запуск процесу Stop-Process Служба очікування

8] Налаштування політики виконання

Хоча PowerShell підтримує створення та виконання сценаріїв, існують обмеження для кожного з них в рамках деяких заходів безпеки. Ви можете переключити рівень безпеки на будь-який із 4 рівнів. Ви можете використовувати командлет Set-ExecutionPolicy, а потім будь-який з рівнів безпеки, зазначених у

Set-ExecutionPolicy Необмежений Set-ExecutionPolicy Усі підписано Set-ExecutionPolicy Віддалений підпис Set-ExecutionPolicy Restricted

Тут політики згори донизу варіюються від найнижчого до найвищого рівня безпеки.

9] Скопіюйте файл або каталог

Користувач може використовувати командлет Copy-Item

Copy-Item "E: \ TWCTest.txt" -Destination "D: \"

10] Видалити файл або каталог

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

Remove-Item "E:\TWCTest.txt"