Geek School Узнайте, как использовать рабочие места в 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 -Name GetFileList | Stop-Job
Однако после того, как вы остановили задание, все данные, которые оно получило до момента, когда вы остановили его, все еще доступны. Хотя есть и гоча. В PowerShell, когда вы получаете результаты для работы, они удаляются. Чтобы они остались, необходимо указать параметр keep switch функции Receive-Job..
Get-Job -Name GetFileList | Получи работу
Как только вы закончите работу, лучше всего ее удалить. Чтобы удалить задание, просто отправьте его в командлет Remove-Job..
Get-Job -Name 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 -Id 3 | Получить работу -Keep -ComputerName Viper
Кроме того, вы можете получить результаты от конкретной дочерней работы, используя ее идентификатор работы.
Get-Job -Id 3 -IncludeChildJob
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 (New-JobTrigger -Daily -At 5pm) -ScheduledJobOption (New-ScheduledJobOption -RunElevated)
В этой команде много чего происходит, поэтому давайте разберем ее.
- Сначала мы даем нашей запланированной работе имя GetEventLogs.
- Затем мы сообщаем ему, что при запуске мы хотим, чтобы он запускал содержимое указанного блока скрипта, который в основном получает 100 новых записей журнала событий безопасности..
- Далее мы указываем триггер. Поскольку параметр триггера принимает объект триггера в качестве входных данных, мы использовали команду в скобках, чтобы сгенерировать триггер, который будет срабатывать каждый день в 17:00..
- Поскольку мы имеем дело с журналом событий, нам нужно работать от имени администратора, который мы можем указать, создав новый объект ScheduledJobOption и передав его в параметр ScheduledJobOption.
Поскольку это немного другой тип задания, вам также нужно будет использовать другую команду для получения списка всех запланированных заданий на компьютере..
Get-ScheduledJob
Это все, что нужно сделать.