Windows PowerShell: Общие параметры и переменные среды выполнения

OSzone.net » Microsoft » PowerShell » Windows PowerShell: Общие параметры и переменные среды выполнения
Автор: Дон Джонс
Иcточник: TechNetMagazine
Опубликована: 09.09.2013

Одна из приятных вещей, касающаяся рабочего процесса, в том, что вы получаете массу встроенной функциональности. Например, каждый процесс, который вы пишете, на внутреннем уровне знает, как взаимодействовать с удаленными компьютерами посредством Windows PowerShell Remoting (удаленное управление Windows, известное как WinRM (Windows Remote Management)).

Это означает, что вы можете писать каждый рабочий процесс, предназначая его для выполнения на локальном компьютере, и то же самое делать удаленно. Общие параметры и переменные рабочего процесса позволяют получить доступ к этим встроенным «быстродоступным» средствам.

Общие параметры рабочего процесса

Все они описаны в справочном файле about_WorkflowCommonParameters, хотя вам нужно вручную импортировать модуль PSWorkflow в Windows PowerShell 3.0, чтобы сделать этот файл видимым. Вот несколько из часто используемых параметров:

-PSParameterCollection, @{PSComputerName='ONE';
 PSConnectionRetryCount=10}, @{PSComputerName='TWO';
 PSConnectionRetryCount=20}

Помните, что все рабочие процессы получают эти параметры. Вам не нужно писать ни строки кода, чтобы они работали. И они бесплатны, что удивительно.

Автоматические переменные рабочего процесса

Все обычные автоматические переменные Windows PowerShell, такие как $Args, $Error, $MyInvocation, $PSBoundParameters и $PsCmdlet, доступны в рабочем процессе. Рабочие процессы добавляют еще немало переменных к тому, что предлагает Windows PowerShell:

Весь набор переменных отражает содержимое описанных выше общих параметров рабочего процесса. Например, $PSComputerName содержит значение параметра -PSComputerName. Вы также можете использовать $ParentJobName и $JobName для доступа к информации задания. Если -PSComputerName содержит несколько значений, то каждый компьютер, где выполняется рабочий процесс, увидит только свое имя в $PSComputerName. Подробнее см. полный список переменных.

Правила переменных

Помните, что переменные в рабочем процессе работают немного по-другому. Например, нельзя присвоить переменной результат подвыражения. Вместо:

$x = $(Get-Service)

вы просто выполняете:

$x = Get-Service

Кроме того, нельзя присвоить значение переменной другой переменной в том же выражении:

$a = $b = 23

Вы должны сделать это двумя операциями. Кроме того, нельзя поместить объект в переменную и изменять свойства этого объекта:

$obj = New-PSSessionOption
$obj.SkipCACheck = $true

Ваши собственные параметры и переменные

В ваших рабочих процессах, конечно, можно вводить определения собственных входных параметров в блоке Param. В рабочем процессе они представляются в виде переменных. Например, определение -MyParam дает внутри рабочего процесса переменную $MyParam. Только не добавляйте общие параметры рабочего процесса. Их по волшебству добавляет Windows PowerShell при выполнении рабочего процесса.

Общие параметры действия

Тут можно слегка запутаться — каждая команда, которую вы выполняете в рабочем процессе, или каждый блок команд, выполняемых в блоке InlineScript{}, считается действием. Windows PowerShell также добавляет к этим действиям общие параметры, включая -PSComputerName. Поскольку эти действия выглядят как обычные командлеты, это может привести к путанице. Например:

Get-Process –PSComputerName ONE,TWO,THREE

Обычный командлет Get-Process имеет параметр -ComputerName, а не параметр -PSComputerName. Последний действителен только в рабочем процессе, где Get-Process технически не является командлетом — это действие рабочего процесса. Блок InlineScript{} поддерживает эти параметры:

InlineScript { Get-Process } –PSComputerName ONE,TWO,THREE

Команды внутри InlineScript{} являются просто командлетами. Они не получают общие параметры действия. Наконец, и просто чтобы еще больше запутать вас, любая команда, которая не имеет эквивалентного действия рабочего процесса, будет неявно обернута в InlineScript{}, но не может использовать общие параметры действия. Например:

Get-WindowsFeature

Это команда, а не действие рабочего процесса. Эквивалентное действие не доступно. И вы не узнаете об этом, потому что это невозможно узнать. Но вы не можете добавить к нему -PSComputerName. Вот где рабочий процесс досаждает, потому что нет простого способа выяснить, действие это или нет. Поэтому вы не узнаете это, пока не испытаете и не получите успех или неудачу.

Видите, как все усложняется?

Вот где становится труднее работать с рабочими процессами. Все эти дополнительные средства скрыты от вас под капотом. Несмотря на пользу большинства из них, они реализованы не последовательно. В итоге вам зачастую приходится работать методом проб и ошибок.

Просто помните, что рабочий процесс — это другой мир. Windows PowerShell лишь обеспечивает шлюз к нему. Не стоит ожидать полной согласованности с обычной средой Windows PowerShell.


Ссылка: http://www.oszone.net/22027/PowerShell