Школа Geek: дізнайтеся, як використовувати робочі місця в PowerShell

PowerShell має чотири типи завдань - фонові завдання, віддалені завдання, завдання WMI та заплановані завдання. Приєднуйтесь до нас, щоб дізнатися, що вони з себе представляють і як ми можемо їх використовувати.

Обов'язково прочитайте попередні статті серії:


  • Дізнайтеся, як автоматизувати Windows за допомогою PowerShell
  • Навчитися використовувати командлети в PowerShell
  • Вивчення, як використовувати об'єкти в PowerShell
  • Навчання форматуванню, фільтрації та порівнянні з PowerShell
  • Навчіться використовувати Remoting в PowerShell
  • Використання PowerShell для отримання інформації про комп'ютер
  • Робота з збірками в PowerShell

І залишайтеся з нами до кінця серіалу весь тиждень.

Фонові завдання

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

Start-Job –Name GetFileList –Scriptblock {Get-ChildItem C: \ –Recurse}

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

Коли ви запускаєте нове завдання, PowerShell створює новий об'єкт завдання, який представляє це завдання. Ви можете отримати список всіх завдань у будь-який час, виконавши командлет Get-Job.

Об'єкти завдань повідомляють вам про стан завдань. Наприклад, на наведеному вище знімку екрану ми бачимо, що у нас є BackgroundJob з ім'ям GetFileList, який все ще працює, але вже почав повертати дані. Якщо в якийсь момент ви вирішите, що завдання виконується занадто довго, ви можете легко зупинити його, відправивши в Stop-Job.


Get-Job — Имя GetFileList | Stop-Job

Однак після того, як ви зупинили завдання, всі дані, які воно отримало до моменту, коли ви зупинили його, все ще доступні. Хоча є й гоча. У PowerShell, коли ви отримуєте результати для роботи, вони вилучаються. Щоб залишитися, вам слід вказати параметр keep switch для Receive - Job.

Get-Job - Ім'я GetFileList | Receive-Job - зберегти

Як тільки ви закінчите роботу, краще всього її видалити. Щоб вилучити завдання, просто відправте його в командлет Remove-Job.

Get-Job — Имя GetFileList | Remove-Job

Це вилучить його зі списку завдань, які повертає Get-Job.

Віддалені вакансії

Кілька уроків тому ми розглянули, як ми можемо використовувати віддалену взаємодію для виконання команд PowerShell на віддаленому комп'ютері за допомогою Invoke-Command, але чи знаєте ви, що ви також можете використовувати Invoke-Command для запуску завдання віддаленої взаємодії у фоновому режимі? Для цього просто додайте параметр -AsJob в кінець вашої команди:


Invoke-Command -ComputerName Flash, Viper -Credential адміністратор -ScriptBlock {gci} -AsJob

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

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

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

Є два способи обійти це. По-перше, якщо ви знаєте, для яких комп'ютерів ви хочете отримати результати, ви можете просто використовувати параметр ComputerName командлета Recieve -Job.


Get-Job — № 3 | Receive-Job –Keep –ComputerName Viper

Крім того, ви можете отримати результати від певної дочірньої роботи, використовуючи її ідентифікатор роботи.

Get-Job -Id 3 –IncludeChildJob

Get-Job -Id 5 | Receive-Job - зберегти

Робота WMI

Завдання WMI багато в чому подібні до віддалених завдань, для яких потрібно додати тільки параметр -AsJob в командлет Get-WmiObject.


На жаль, це означає, що вони також піддаються тим же помилкам, про які я згадував у розділі «Віддалені завдання».

Заплановані робочі місця

Останні три види робіт, на які ми дивилися, не були постійними, а це означає, що вони доступні тільки в поточному сеансі. По суті, це означає, що якщо ви запускаєте завдання, а потім відкриваєте іншу консоль PowerShell і запускаєте Get-Job, ви не побачите ніяких завдань. Однак, повернувшись до консолі, з якою ви запустили завдання, ви зможете побачити його статус. Це на відміну від запланованих робочих місць, які є постійними. По суті, заплановане завдання - це блок сценарію, який виконується за розкладом. У минулому такого ж ефекту можна було досягти за допомогою планувальника завдань Windows, що насправді і відбувається під капотом. Щоб створити нову заплановану роботу, ми робимо наступне:

Register-ScheduledJob -Name GetEventLogs -ScriptBlock {Get-EventLog -LogName Security -Newest 100} -Trigger (New-JobTrigger -Daily -At 5pm) -ScheduledJobOption (New-ScheduledJobOption -RunElevated)

У цій команді багато чого відбувається, тому давайте розберемо її.

  • Спочатку ми даємо нашій запланованій роботі ім'я GetEventLogs.
  • Потім ми повідомляємо йому, що при запуску ми хочемо, щоб він запускав вміст зазначеного блоку скрипту, який в основному отримує 100 нових записів в журналі подій безпеки.
  • Далі ми вказуємо тригер. Оскільки параметр тригера приймає об'єкт тригера в якості вхідних даних, ми використовували команду в дужках, щоб згенерувати тригер, який буде спрацьовувати кожен день в 17:00.
  • Оскільки ми маємо справу з журналом подій, нам потрібно працювати від імені адміністратора, який ми можемо вказати, створивши новий об'єкт ScheduledJobOption і передавши його в параметр ScheduledJobOption.

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


Get-ScheduledJob

Це все, що потрібно зробити.

COM_SPPAGEBUILDER_NO_ITEMS_FOUND