sergey vasin

The IT blog

Используем Windows PowerShell Jobs – Hey, Scripting Guy! Blog

leave a comment »

Резюме: Microsoft Scripting Guy, Ed Wilson публикует отрывок из его новой книги, касающийся использования Windows PowerShell Jobs (фоновых заданий PowerShell).

Microsoft Scripting Guy, Ed Wilson на связи. Сегодня я собираюсь опубликовать отрывок из моей новой книги Windows PowerShell 3.0 Step by Step, издаваемой Microsoft Press. Сейчас эта книга доступна для предварительного заказа.

Используем Windows PowerShell Jobs

Я могу запустить новое задание Windows PowerShell используя командлет Start-Job. Команда, которую нужно запустить в качестве задания помещается в скриптблок. Задания именуются последовательно – Job1, Job2 и т.д.

PS C:\> Start-Job -ScriptBlock {get-process}

Id Name PSJobTypeName State HasMoreData Location

— —- ————- —— ———— ———

10 Job10 BackgroundJob Running True localhost

PS C:\>

Также задания получают Job ID, которые также назначаются последовательно. Первое задание, созданное в консоли Windows PowerShell всегда получает Job ID равный единице. Для получения информации о задании вы можете использовать как его имя, так и Job ID.

PS C:\> Get-Job -Name job10

Id Name PSJobTypeName State HasMoreData Location

— —- ————- —— ———— ———

10 Job10 BackgroundJob Completed True localhost

PS C:\> Get-Job -Id 10

Id Name PSJobTypeName State HasMoreData Location

— —- ————- —— ———— ———

10 Job10 BackgroundJob Completed True localhost

PS C:\>

После того, как вы увидите, что задание выполнено, вы можете получить его результаты. Для получения этой информации используется командлет Receive-Job.

PS C:\> Receive-Job -Name job10

Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName

——- —— —— —— —— —— — ————

62 9 1672 6032 80 0.00 1408 apdproxy

132 9 2316 5632 62 1364 atieclxx

122 7 1716 4232 32 948 atiesrxx

114 9 14664 15372 48 1492 audiodg

556 62 53928 5368 616 3.17 3408 CCC

58 8 2960 7068 70 0.19 928 conhost

32 5 1468 3468 52 0.00 5068 conhost

784 14 3284 5092 56 416 csrss

529 27 2928 17260 145 496 csrss

182 13 8184 11152 96 0.50 2956 DCPSysMgr

135 11 2880 7552 56 2056 DCPSysMgrSvc

После того, как результаты задания получены, вы не сможете получить их еще раз, если конечно вы не сохранили их в переменной. Следующая команда иллюстрирует эту концепцию.

PS C:\> Receive-Job -Name job10

PS C:\>

Может немного смущать тот факт, чтоб объект задания по-прежнему существует, и информация о нем может быть получена посредством командлета Get-Job.

PS C:\> Get-Job -Id 10

Id Name PSJobTypeName State HasMoreData Location

— —- ————- —— ———— ———

10 Job10 BackgroundJob Completed False localhost

Рекомендуется использовать командлет Remove-Job для удаления объектов завершенных заданий. Это поможет избежать путаницы между активными, завершенными и ожидающими выполнения заданиями. После того, как задание удалено, командлет Get-Job будет возвращать ошибку при попытке получить информацию о задании — поскольку оно более не существует.

PS C:\> Remove-Job -Name job10

PS C:\> Get-Job -Id 10

Get-Job : The command cannot find a job with the job ID 10. Verify the value of theId parameter

and then try the command again.

At line:1 char:1

+ Get-Job -Id 10

+ ~~~~~~~~~~~~~~

+ CategoryInfo : ObjectNotFound: (10:Int32) [Get-Job], PSArgumentException

+ FullyQualifiedErrorId : JobWithSpecifiedSessionNotFound,Microsoft.PowerShell.

Commands.GetJobCommand

При работе с заданиями, я предпочитаю давать им описательные имена. Задание, которое возвращает список процессов посредством использования командлета Get-Process может называться getProc. Схема контекстно-зависимого именования более удобна, нежели имена вроде Job1 и Job2. Не стоит опасаться, что в этом случае имена заданий будут слишком длинными, так как вы всегда можете воспользоваться символами подстановки при запросе информации о заданиях.

При получении результатов задания, сохраняйте данные в переменной.

PS C:\> Start-Job -Name getProc -ScriptBlock {get-process}

Id Name PSJobTypeName State HasMoreData Location

— —- ————- —— ———— ———

12 getProc BackgroundJob Running True localhost

PS C:\> Get-Job -Name get*

Id Name PSJobTypeName State HasMoreData Location

— —- ————- —— ———— ———

12 getProc BackgroundJob Completed True localhost

PS C:\> $procObj = Receive-Job -Name get*

PS C:\>

После того, как вы сохраните полученный объект в переменной, вы можете использовать его в других командлетах Windows PowerShell. Однако стоит помнить о том, что это десериализованный объект. Это можно обнаружить, воспользовавшись командлетом Get-Member (gm – его алиас).

PS C:\> $procObj | gm

TypeName: Deserialized.System.Diagnostics.Process

Это означает, что будут доступны не все члены .NET Framework объекта System.Diagnostics.Process. Методы обычного объекта приведены ниже (gps – это алиас для Get-Process, gm – алиас для Get-Member и –m – это достаточная для работы командлета часть параметра –membertype).

PS C:\> gps | gm -m method

TypeName: System.Diagnostics.Process

Name MemberType Definition

—- ———- ———-

BeginErrorReadLine Method System.Void BeginErrorReadLine()

BeginOutputReadLine Method System.Void BeginOutputReadLine()

CancelErrorRead Method System.Void CancelErrorRead()

CancelOutputRead Method System.Void CancelOutputRead()

Close Method System.Void Close()

CloseMainWindow Method bool CloseMainWindow()

CreateObjRef Method System.Runtime.Remoting.ObjRef CreateObjRef(type requestedType)

Dispose Method System.Void Dispose()

Equals Method bool Equals(System.Object obj)

GetHashCode Method int GetHashCode()

GetLifetimeService Method System.Object GetLifetimeService()

GetType Method type GetType()

InitializeLifetimeService Method System.Object InitializeLifetimeService()

Kill Method System.Void Kill()

Refresh Method System.Void Refresh()

Start Method bool Start()

ToString Method string ToString()

WaitForExit Method bool WaitForExit(int milliseconds), System.Void WaitForExit()

WaitForInputIdle Method bool WaitForInputIdle(int milliseconds), bool WaitForInputIdle()

Теперь давайте получим доступные методы для десериализованного объекта.

PS C:\> $procObj | gm -m method

TypeName: Deserialized.System.Diagnostics.Process

Name MemberType Definition

—- ———- ———-

ToString Method string ToString(), string ToString(string format, System.IFormatProvider formatProvider)

PS C:\>

Автор:

Ed Wilson, Microsoft Scripting Guy

Оригинал:

http://blogs.technet.com/b/heyscriptingguy/archive/2012/12/31/using-windows-powershell-jobs.aspx


Страницы в социальных сетях:

Twitter: https://twitter.com/vsseth
Facebook: https://fb.com/inpowershell
VKontakte: https://vk.com/inpowershell


Реклама

Written by Сергей Васин

Январь 5, 2013 в 17:29

Опубликовано в HeyScriptingGuyBlog, PowerShell

Tagged with

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s