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
Это все, что нужно сделать.