Geek School Дізнайтеся, як використовувати вакансії в PowerShell
PowerShell має чотири типи завдань - фонові завдання, віддалені завдання, завдання WMI і заплановані завдання. Приєднуйтесь до нас, коли ми дізнаємося, що вони є і як ми можемо їх використовувати.
Обов'язково прочитайте попередні статті серії:
- Дізнайтеся, як автоматизувати Windows за допомогою PowerShell
- Навчання використанню командлетів у PowerShell
- Навчання використанню об'єктів у PowerShell
- Навчання форматування, фільтрації та порівняння в PowerShell
- Дізнайтеся, як використовувати віддалене використання в PowerShell
- Використання PowerShell для отримання інформації про комп'ютер
- Робота з колекціями в PowerShell
І залишайтеся з нами для решти серії цілий тиждень.
Фонові робочі місця
До цих пір все, що я показав вам у PowerShell, було синхронним, що означає, що ми вводимо щось у оболонку і не можемо зробити багато чого доти, поки ця команда не завершиться. Тут заходять фонові завдання. Щоб запустити фон, завдання просто передає блок сценарію до командлета Start-Job.
Почати-завдання-ім'я GetFileList -Scriptblock Get-ChildItem C: \ t
Тепер ми можемо робити все, що ми хочемо в оболонці, поки цей блок сценаріїв виконується у фоновому режимі.
Коли ви починаєте роботу, PowerShell створює новий об'єкт завдання, який представляє цю роботу. Ви можете отримати список всіх завдань у будь-який час, виконавши командлет Get-Job.
Об'єкти завдання розповідають про стан завдань. Наприклад, у наведеному вище скріншоті ми бачимо, що у нас є BackgroundJob під назвою GetFileList, який все ще працює, але вже почав повертати дані. Якщо в будь-який момент ви вирішили, що робота виконується занадто довго, ви можете легко зупинити його, передавши її в Stop-Job.
Get-Job-ім'я GetFileList | Стоп-робота
Однак, як тільки ви зупинили роботу, якими б не були дані, до тих пір, поки ви не зупините роботу, це все ще доступне. Хоча, є. У PowerShell, як тільки ви отримаєте результати для завдання, вони видаляються. Щоб вони залишилися, необхідно вказати параметр зберегти параметр Receive-Job.
Get-Job-ім'я GetFileList | Отримати роботу -Дотримуватися
Коли ви закінчите роботу, краще видалити її. Щоб видалити завдання, просто перетягніть його в командлет Remove-Job.
Get-Job-ім'я GetFileList | Видалити роботу
Це видалить його зі списку завдань, які повертаються Get-Job.
Віддалені завдання
Кілька уроків тому ми розглянули, як ми можемо використовувати віддалені команди для виконання команд PowerShell на віддаленому комп'ютері за допомогою Invoke-Command, але чи знаєте ви, що ви також можете використовувати команду Invoke-Command для запуску роботи, що віддаляється, у фоновому режимі? Для цього просто додайте параметр -AsJob до кінця вашої команди:
Invoke-Command -Комп'ютерне ім'я Flash, Viper -адміністратор-scriptBlock gci -AsJob
Це була проста команда, і вона повинна була закінчити виконання тепер, так що давайте подивимося на наш статус робочих місць.
Хм, схоже, що він провалився. Це приводить мене до мого першого gotcha з робочими місцями. Коли ви створюєте нове завдання будь-якого типу в PowerShell, воно створює одну батьківську роботу на додаток до одного дочірнього завдання для кожного комп'ютера, проти якого виконується завдання. Коли ви використовуєте командлет Get-Job, він показує лише батьківські завдання, а властивість стану - найгірший сценарій, а це означає, що навіть якщо команда не вдалося запустити на одному з сотень комп'ютерів, стан батьківських завдань скаже: не вдалося. Щоб переглянути список дочірніх завдань, потрібно використовувати параметр IncludeChildJob.
Якщо ви подивитеся ближче, ви побачите, що робота дійсно провалилася лише на одному комп'ютері, що призвело до наступного переходу. При спробі отримати результати для завдання, якщо вказати ім'я або ідентифікатор завдання батька, PowerShell поверне дані з усіх дочірніх завдань. Проблема полягає в тому, що якщо в одній з дочірніх робіт була помилка, ми залишимо якийсь червоний текст.
Є два способи обійти це. По-перше, якщо ви знаєте, для яких комп'ютерів потрібні результати, можна просто скористатися параметром ComputerName командлета Receive -Job.
Get-Job -Id 3 | Отримувати-Робота -Кеп -Комп'ютер-Ім'я Viper
Крім того, можна отримати результати з конкретного дочірнього завдання, використовуючи його ідентифікатор завдання.
Get-Job -Id 3 -ВключитиДитяча робота
Get-Job -Id 5 | Отримати роботу -Дотримуватися
Вакансії WMI
Вакансії WMI такі ж, як і віддалені завдання, що вимагає додавання лише параметра -AsJob до командлета Get-WmiObject..
На жаль, це означає, що вони також підпадають під дію тих самих дозволів, які я згадував у розділі Віддалені завдання.
Заплановані вакансії
Останні три види робочих місць, які ми розглядали, не були постійними, а це означає, що вони доступні лише у поточній сесії. В основному, це означає, що якщо ви почнете роботу, а потім відкриєте іншу консоль PowerShell і запустіть Get-Job, ви не побачите жодних завдань. Проте, повернувшись до консолі, з якої ви вигнали роботу, ви зможете побачити її статус. Це на відміну від запланованих вакансій, які є стійкими. В основному, заплановане завдання - це блок сценаріїв, який виконується за розкладом. У минулому такий самий вплив можна було досягти за допомогою планувальника завдань Windows, що дійсно відбувається під капотом. Щоб створити нове завдання за розкладом, виконайте наведені нижче дії.
Register-ScheduledJob -Name GetEventLogs -ScriptBlock Get-EventLog -LogName Security -Newest 100 -Trigger (Новий-JobTrigger -Daily -At 5:00) -ScheduledJobOption (Нова-ScheduledJobOption -RunElevated)
У цій команді багато що відбувається, так що давайте розберемо її.
- По-перше, ми надаємо нашому Scheduled Job ім'я GetEventLogs.
- Потім ми повідомимо, що при спрацьовуванні ми хочемо, щоб він запускав вміст вказаного блоку сценаріїв, який, в основному, отримує найновіші 100 записів журналу подій безпеки.
- Далі задаємо тригер. Оскільки параметр тригера приймає об'єкт тригера як вхідний, ми використали команду для створення тригера, який вимикається кожен день о 17:00.
- Оскільки ми маємо справу з журналом подій, нам потрібно запускати як адміністратора, який ми можемо вказати, створивши новий об'єкт ScheduledJobOption і передавши його параметру ScheduledJobOption..
Оскільки це трохи інший тип завдання, вам також потрібно використовувати іншу команду для отримання списку всіх запланованих завдань на машині.
Get-ScheduledJob
Це все, що потрібно.