Продолжаем тему нововведений в 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 windowsnotes.ru
$w.links | fl innerText, href
Или взять RSS фид и вывести из него названия статей и ссылки:
Invoke-RestMethod http://feeds/feedburner.com/windowsnotesru | fl Title, Link
Web Access
И если уж речь зашла о Web, то упомяну о еще одной интересной
возможности — PowerShell Web Access. С ее помощью можно подключаться к
удаленным серверам и работать с PowerShell прямо в веб-браузере.
На этом, пожалуй, закончу. Конечно, я описал далеко не все возможности PowerShell 3.0, так что в ближайшем будущем планирую вернуться к этой теме более подробно. Также о PowerShell 3.0 можно почитать (на английском) здесь http://technet.microsoft.com/en-us/library/hh857339.aspx и здесь http://technet.microsoft.com/en-us/library/hh847833.aspx.