PowerShell 30 Огляд нових можливостей (частина 2).
Продовжуємо тему нововведень в PowerShell 3.0. У першій частині ми розглянули загальні зміни, в основному стосуються зручності роботи. Сьогодні ми торкнемося технологій, призначених для автоматизації та віддаленої роботи, в тому числі через Web.
Sheduled Jobs
Для початку згадаємо, що з себе представляють ці самі Jobs.Фонові завдання (Jobs) з'явилися ще в другому PowerShell. Вони дають можливість виконати команду «у фоновому режимі», без взаємодії з поточним сеансом користувача. Це досить зручно, адже поки завдання виконується у фоновому режимі, можна продовжувати роботу в поточному сеансі, не чекаючи його завершення.
Для прикладу запустимо фонове завдання з ім'ям Hello, яке виводить вітання активного користувача:
Start-Job -Name Hello {Write-Output "Hello, $ env: username"}
командлети Start-Job відкриє дочірній процес PowerShell, виведе в ньому вітання і закриє процес. Правда результат ми не побачимо, для його отримання доведеться скористатися командою:
Get-Job -Name Hello | Receive-Job
Ця команда візьме Job по імені Hello і видасть результат його роботи.
В PowerShell 3.0 з'явилася можливість планувати виконання фонових завдань прямо з консолі. Наприклад я хочу отримати вітання не зараз, а о 4 годині дня. Створюю тригер:
$ t = New-JobTrigger -Once -At 4pm
І реєструю завдання, яке запуститься з цього триггеру:
Register-SheduledJob - Name Hello -ScriptBlock {Write-Output "Hello, $ env: username"} -Trigger $ t
Тепер рівно о 4 годині дня завдання Hello буде запущено.
І щоб в цьому переконатися, відкриємо Task Sheduler і в розділі PowerShell \ SheduledJobs побачимо наше завдання .
Планувати виконання завдання можна як одноразово, в певний час, так і періодично (напр. кожен понеділок). Також запуск завдання можна прив'язати до певної події в системі, наприклад до завантаження або входу в комп'ютер.
Workflow
Windows PowerShell Workflow, або просто робочі процеси - нововведення, що вперше з'явилося в PowerShell 3.0. Workflow в PowerShell засновані на Windows Workflow Foundation і призначені для автоматизації складних процесів, які займають багато часу і виконуються у великих масштабах.Простіше кажучи, Workflow призначений для надійного виконання довгострокових завдань на безлічі комп'ютерів.
Workflow забезпечують підтримку паралельних обчислень, повторних операцій і головне - можливість припиняти і відновлювати роботу. Наприклад, робочий процес може виявити проблему, яка вимагає ручного втручання, повідомити про це користувача і призупинити виконання завдання до тих пір, поки він не виправить ситуацію і не відновить процес.
Як приклад візьмемо все той же вітання і трохи його змінимо. Ця команда виведе вітання користувачеві, почекає 10 хвилин і потім попрощається з ним:
Write-Output "Hello, $ env: username!"; sleep 600; Write-Output "Good Bye!"
А тепер створимо робочий процес з ім'ям Hello:
workflow Hello {Write-Output -InputObject "Hello, $ env: username!"; Start-Sleep -Seconds 600; Write-Output -InputObject "Good Bye!"}
Що ми можемо зробити з цим робочим процесом? Чи можемо використовувати його як звичайну функцію, викликавши по імені, а можемо запустити як фонове завдання:
$ j = Hello -AsJob
За допомогою команди Suspend-Job призупинимо виконання завдання і подивимося, що вона встигла зробити.
А тепер увага, смертельний номер - ми закриємо сесію. Звичайний Job при цьому повинен загинути разом з результатами своєї роботи. Перевіримо. Відкриваємо нову сесію, робимо експорт модуля PSWorkflow і дивимося поточні завдання. Ось воно, наше завдання, знаходиться в стані Suspended.І ми можемо продовжите його виконання командою
Resume-Job з того місця, де воно було зупинено.
Більш того, можна просто закрити сесію, не зупиняючи процес, і навіть пустити комп'ютер в перезавантаження, робочий процес все одно виживе і зможе продовжити роботу.Таким чином, в поєднанні з Sheduled Jobs ми отримуємо інструмент для автоматизації, надійний, потужний і гнучко настроюється.
Стійкі сесії
Дистанційні сесії в PS 3.0 зроблені більш стійкими до проблем мережі. При розриві з'єднання PowerShell не закриває відразу віддалену сесію, а протягом 4 хвилин намагається відновити підключення.
Якщо протягом 4 хвилин підключення з'явиться, то сесія буде відновлена а запущене в ній завдання виконано , в іншому випадку сесія буде роз'їдені.
Але це ще не все. При роз'єднанні сесія не видаляється, а перетворюється на стан disconnected, і до неї можна знову підключитися як з того ж, так і з будь-якого іншого комп'ютера.
Як приклад відкриємо віддалену сесію з ім'ям Test на комп'ютері SRV3 і запустимо в цій сесії команду, яка буде виводити всі запущені на комп'ютері процеси з інтервалом в 1 хвилину:
$ S = New-PSSession -Name Test -ComputerName SRV3
Invoke-Command -Session $ S {Get-Process | foreach {$ _; sleep 60} -AsJob
Після чого розірвемо сесію командою Disconnect-Session.Тепер сесія Test знаходиться в стані disconnected.
Заходимо на інший комп'ютер, відкриваємо консоль PowerShell, підключаємося до сесії Test:
Connect-PSSession -Name Test -ComputerName SRV3
І отримуємо результати роботи, запущеної в цій сесії:
Receive-PSSession -Name Test
Як бачите, завдання спокійно залишиться активним.
Файли конфігурації сесії
Як ви пам'ятаєте, у віддаленій сесії призначене для користувача оточення визначається конфігурацією сеансу. За допомогою файлу конфігурації сесії це оточення можна дуже гнучко налаштовувати - визначати власні функції і змінні, імпортувати модулі, задавати видимі командлети і багато іншого.Є навіть можливість вказати облікові дані користувача, від імені якого буде запущена сесія.
Наведу простий приклад. Отже, ми хочемо щоб в віддаленому сеансі були доступні тільки командлети для перегляду. Створюємо новий файл конфігурації OnlyGet.pssc:
New-PSSessionConfigurationFile -VisibleCmdlets Get- * -Path C: \ PS \ OnlyGet.pssc
Файл створений і його навіть можна відкрити і подивитися в звичайному блокноті командою:
Invoke-Item -Path C: \ PS \ OnlyGet.pssc
Потім, використовуючи створений файл, реєструємо нову конфігурацію з ім'ям GetOnly:
Register-PSSessionConfiguration -Name GetOnly -Path C: \ PS \ OnlyGet.pssc
Зверніть увагу, що реєстрація нової конфігурації або зміна існуючої вимагають підвищених привілеїв.
підключити до віддаленого комп'ютера SRV3, використовуючи нову конфігурацію і подивимося поточний час і дату:
$ S = New-PSSession -ComputerName SRV3 -ConfigurationName GetOnly
Invoke-Command -Session $ S {Get-Date}
Команда виконається успішно. А тепер спробуємо змінити час, зсунувши його на 10 хвилин назад:
Invoke-Command -Session $ S {Set-Date -Ajust -0: 10: 0}
І отримаємо помилку , оскільки в даній сесії видно тільки командлети Get.
Відкриємо ще одну сесію на SRV3 з іншою конфігурацією, в якій дозволені командлети Set, і пробуємо ще раз змінити час. На цей раз команда буде виконана.
Командлети Web
Ще PowerShell 3.0 вміє звертатися до веб-сервісів безпосередньо, без посередників. Наприклад, я можу звернеться до головній сторінці свого блогу і отримати список посилань:
$ w = Invoke-WebRequest teamhelps.pp.ua
$ w.links | fl innerText, href
Або взяти RSS фід і вивести з нього назви статей і посилання:
Invoke-RestMethod http://feeds/feedburner.com/windowsnotesru | fl Title, Link
Web Access
І якщо вже мова зайшла про Web, то згадаю про ще одну цікаву можливість - PowerShell Web Access. З її допомогою можна підключатися до віддалених серверів і працювати з PowerShell прямо в веб-браузері.Оскільки я вже описував цю технологію в статті PowerShell Web Access в Windows Server 2012, не буду на ній зупинятися. Скажу лише, що все, що потрібно для роботи з PowerShell Web Access - це будь-який пристрій (телефон, планшет і т.п.), що має доступ в інтернет і браузер з підтримкою JavaScript і включеними cookies.
На цьому, мабуть, закінчу. Звичайно, я описав далеко не всі можливості PowerShell 3.0, так що в найближчому майбутньому планую повернутися до цієї теми більш докладно. Також про PowerShell 3.0 можна почитати (англійською) тут http://technet.microsoft.com/en-us/library/hh857339.aspx і тут http://technet.мікрософт.ком/ен-ус/лібрарі/нн847833.аспс. п>.