Сервісний центр VPSGroup ремонт комп'ютерної техніки, заправка картриджів, ремонт оргтехніки, Київ, Виставковий центр, Васильківська, 55

Передача параметрів в 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 SRV1



Щоб вводити менше тексту, імена параметрів можна скоротити, наприклад так:

. \ service.ps1 -Serv spooler -Comp SRV1

Імена можна і зовсім опустити, хоча це і не дуже правильно.В цьому випадку PowerShell прийме значення параметрів в тому порядку, в якому вони вказані в команді. Так само як і при використанні $ args, значення треба вказувати в тому ж порядку, в якому вони перераховані в сценарії:

. \ Service.ps1 spooler SRV1



Є в 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 SRV1.contoso.com

А така відпрацює нормально:

. \ service.ps1 -Service spooler -Computer SRV1



Так само можна задавати практично будь-які обмеження для вхідних параметрів. Для цього є можливість використовувати регулярні вирази, скрипти та ін.Дізнатися докладніше про ці можливості можна, виконавши в PowerShell команду help about_functions_advanced_parameters.

.