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