А АSunday, 22 August 2021

Передача параметров в PowerShell.


Всем привет.

Случается что создаваемый вами сценарий PowerShell или функция должна принять какое либо входное значение  - имя компьютера, путь к папке, название сервиса и т.п. В PowerShell есть несколько способов передать данные в сценарий из командной строки, сделав их ввод более простым и эффективным.

Самый простой вариант передачи данных - использовать встроенную переменную $args, которая имеет тип одномерный массив (hashtable). Для этого создадим скрипт с именем service.ps1 вот такого содержания:

Get-Service -Name $args[0] -ComputerName $args[1]

Этот скрипт должен вывести состояние заданного сервиса\сервисов для одного или нескольких компьютеров. Имя сервиса и компьютера передаются в скрипт в качестве аргументов.

Теперь выполним его, указав в качестве аргументов сервис печати (spooler) и имя компьютера SRV1:

.\service.ps1 spooler SRV1

Получив эту команду, PowerShell подставит вместо $args[0] название сервиса, вместо $args[1] имя компьютера и выведет полученный результат.

При использовании $args каждое из указываемых значений добавляется в массив, в результате мы получаем возможность передавать в сценарий любое необходимое количество параметров. Однако аргументы должны вводиться ровно в том порядке, в каком они указаны в сценарии, что при большом количестве аргументов может привести к путанице. Кроме того, этот способ ограничивает нас в определении параметров.

Более эффективным способом передачи параметров является использование в сценарии блока param. Для примера возьмем наш сценарий и изменим его:

Param (

[string]$service,

[string]$computer

)

Get-Service -ServiceName $service -ComputerName $computer

Разбивать сценарий на строки необязательно, вполне возможно записать все в одну строку. Если блок param имеется в сценарии или функции, PowerShell сам считывает его и разделяет знаками табуляции. Поскольку имена параметров явно указаны, то их можно вводить в любом порядке, например так:

.\service.ps1 -Service spooler -Computer SRV01

Чтобы вводить меньше текста, имена параметров можно сократить, например так:

.\service.ps1 -Serv spooler -Comp SRV01

Имена можно и совсем опустить, хотя это и не очень правильно. В этом случае PowerShell примет значения параметров в том порядке, в каком они указаны в команде. Так же как и при использовании $args, значения надо указывать в том же порядке, в котором они перечислены в сценарии:

.\service.ps1 spooler SRV01

Ужесточим наш порядок. Есть в PowerShell и более сложный способ передачи параметров, позволяющий задавать параметры как обязательные, указывать для каждого позицию и многое другое. Для примера изменим сценарий следующим образом:

[CmdletBinding()]

Param (

[Parameter (Mandatory=$true, Position=1)]

[string]$service,

[Parameter (Mandatory=$true, Position=2)]

[string]$computer

)

Get-Service -ServiceName $service -ComputerName $computer

Здесь оба параметра указаны как обязательные (Mandatory=$true) и для каждого задана своя позиция. Это значит, что оба параметра обязательно должны быть указаны и должны идти строго в определенном порядке. Теперь если не указать один из параметров, то PowerShell автоматически напомнит об этом и предложит ввести недостающую информацию.

Использование расширенного синтаксиса позволяет задавать различные ограничения для вводимых параметров. Закрутим гайки еще раз - изменим сценарий, указав в нем для имени компьютера ограничение в 3 символа (ValidateLength(1,3):

CmdletBinding()]

Param (

[Parameter (Mandatory=$true)]

[string]$service,

[Parameter (Mandatory=$true)]

[ValidateLength(1,3)]

[string]$computer

)

Get-Service -ServiceName $service -ComputerName $computer

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

.\service.ps1 -Service spooler -Computer SRV01.forza.com

А такая отработает нормально:

.\service.ps1 -Service spooler -Computer SRV01

Подобным образом можно задавать практически любые ограничения для входных параметров. Для этого есть возможность использовать регулярные выражения, скрипты и пр. Узнать подробнее об этих возможностях можно, выполнив в PowerShell команду help about_functions_advanced_parameters.

Успехов.


No comments:

Post a Comment

А что вы думаете по этому поводу?

Версия на печать

Популярное