powershell передача параметров в функцию

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

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

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

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

.\service.ps1 spooler SRV1

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

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

Param (
[string]$service,
[string]$computer
)

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

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

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

.\service.ps1 spooler SRV1

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

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

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

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

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

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

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

Param (
[Parameter (Mandatory=$true)]
[string]$service,

[Parameter (Mandatory=$true)]
[ValidateLength(1,3)]
[string]$computer
)

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

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

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

Источник

Заметки на полях

О чем и для чего этот сайт я пока не решил. Будем считать это тестированием WordPress

PowerShell для программиста. Передача параметров в функцию.

В интернете есть кучи описаний по языку, но почему-то на особо засадные вещи внимание не обращается. Поэтому напишу только о них. А как 2+2 сделать, думаю без проблем найдется где угодно.

Итак, синтаксис PowerShell традиционен, т.е. си-подобный (или php-подобный, или perl-подобный). И эта схожесть дает ложную уверенность, что все можно делать привычными конструкциями. И ведь можно, в смысле ругаться PoSh не станет, но и работать оно тоже не будет. Или хуже – иногда будет, а иногда нет.

И что бы бесконечно не ходить по граблям нужно запомнить всего пару вещей:

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

Дальше подробно распишу про типовые ошибки с передачей параметров (точнее особенностями синтаксиса PowerShell) и заодно будет понятно:

Сначала просто про базовый синтаксис на примере:

Оба варианта вызова в данном случае будут работать как ожидается (получим дабл Васю).

А теперь чуть сложнее – на вход два параметра и немного логики внутри
(-gt значит greater than, т.е. “>”):

При выполнении мы увидим разные результаты выполнения:

Предполагается, что первый параметр “Вася” и его длина 4 символа. Почему при вызове со скобками он вдруг “короче 4”?
Первый раз меня это выбило дня на два 🙂

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

Чуть изменим функцию (добавим первой строкой вывод типа и значения параметра):

Вызовем заново, посмотрим:

Т.е. оказывается вызов: hello(“Вася”, “Костя”) в первый параметр отправляет массив каких-то объектов, а мы-то ждем, что туда попадет строка «Вася».

Конечно, можно посмотреть, что это за массив, определить его длину и т.п., но обойдемся, сразу скажу – это коллекция из двух строк «Вася» и «Костя». И отсюда дважды обескураживающее: “Вася Костя короче 4” (при выводе на экран массив отобразился одной строкой визуально явно длиннее 4, а сравнивается вообще число элементов массива т.е. 2).

Короче говоря вызов:

Т.е. любое перечисление в скобках – это всегда массив (точнее список).

Наш пример будет корректно работать так:

На мой взгляд, это первое что нужно хорошо запомнить про PoSh, если когда-либо писал или пишешь на других языках. Дальше про варианты передачи параметров.

Передача значения по-умолчанию

Тут все совсем просто, т.к. синтаксис не отличается от других языков

Передача параметра по ссылке ([ref])

Передача параметра по ссылке делается приведением к типу [ref] (это специальный класс PowerShell). Две особенности:

На экране будет “Bye!”

И еще одна интересная штука – передача функции или блока кода как параметр

Тоже в общем ничего сложного, рассмотрим функцию с колбэком:

Т.е. просто передаем блок кода, который выполнится в контексте того места, где ему сделают Invoke.

Буду рад, если описанное сэкономит Вам хоть немного времени. 🙂

Источник

PowerShell. Пользовательские функции для пользователей

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функциюПривет! Довольно часто в своей работе приходиться пользоваться самостоятельно написанными функциями и таскать куски кода между разными скриптами. На Хабре уже есть довольно хорошая статья про Повторное использование кода от Mroff, но была необходимость пойти немного дальше, задокументировать и как-то описать свои функции. Как оказалось, поиск выдавал довольно сухую информацию в основном по общей структуре функции и не более того. Упорство было вознаграждено, и я решил поделиться полученной информацией. Добро пожаловать под кат, где мы научимся вносить в свои функции информацию для потомков и коллег.

Давайте для начала разберем стандартную структуру функции в PowerShell. Выглядит она следующим образом

Сложности никакой нет, но появились дополнительные параметры, которые нам упрощают жизнь:

Mandatory – Принимает два значения True обязательный для заполнения и False необязательный;
HelpMessage – Справка по переменной;
ParameterSetName – Имя переменной к которой относятся данные параметры;
Position – Позиция переменной при вызове функции;

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

PowerShell ответит нам одной строкой в которой будет написано: Путь до проверяемого ресурса.

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

Немного усложним задачу и подготовим функцию информация о которой по запросу Get-Help будет выводиться в полном объеме:

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

Давайте разберем что же мы такого написали:

– В данном блоке написаны параметры для справки PowerShell.
.SYNOPSIS – блок для краткого описание функции
.DESCRIPTION – блок для полного описание функции
.EXAMPLE – блок для примера использования функции, может быть несколько
.PARAMETR Имя параметра – блок для описания переменной, для каждой переменной свой блок.

Как вы могли заметить текстовый комментарий начинается со следующей строки после ключевого названия раздела и может быть многострочным. Окончанием комментария считается закрывающий тег #> или следующий блок.

Теперь все пользовательские функции можно использовать централизованно и вам не придется вспоминать какой параметр за что отвечает, а также какой тип данных использует та или иная переменная.

Источник

Используем параметры в функциях Powershell с param и Parameter

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

При создании функции Powershell мы можем передать в нее разные параметры использую атрибут Parameters() и блок param(). Эти параметры могут быть использованы при работе в конвейере, валидации типов данных, определении обязательности их использования, значений по умолчанию и многого другого. В этой статье мы разберем как использовать Powershell Parameters() и param() на примерах.

Навигация по посту

Где и как использовать param и Parameters

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

Ситуация меняется, например, когда вам нужно пинговать разные хосты. Самым плохим вариантом будет дублирование предыдущего кода:

Для соблюдения принципа DRY есть несколько вариантов.

Переменная args

В Powershell, так же как и во многих других языках, существует переменная ‘args’. Смысл в этой переменной хранить все переданные значения в коллекции (так же называются списки, листы или просто массив).

Эта переменная создается автоматически при вызове команды:

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

Что бы получать доступ к каждому значение мы должны обращаться к нему по индексу:

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

Одна из проблем, которая появляется при использовании ‘$args’, неочевидность использования. Спустя время вы, или другой человек, можете не вспомнить про порядок передаваемых значений, их типы данных и т.д. Нужно будет открывать код и читать его что бы разобраться в этом.

Именованные параметры

Использование ключей выглядит так:

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

Вряд ли у вас возникнут сомнения в том, что должно находится в параметре «ComputerName» или «Hops». Это нельзя гарантировать при использовании «$args».

Что бы реализовать параметры в вашей функции существует 2 подхода.

Первый способ похож на реализацию параметров в большинстве языков, мы просто помещаем их в круглые скобки:

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

Второй способ реализуется через блок param() в котором мы объявляем параметры:

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

Блок ‘param’ более предпочтительный способ. Он принят сообществом как стандарт передачи параметров. Кроме этого он позволяет использовать расширенный функционал.

Расширенные функции с CmdletBinding и Parameter

В Powershell есть понятие расширенных функций. Эти функции создаются при наличии одного или двух атрибутов: ‘CmdletBinding ‘ и ‘Parameter’. Благодаря им у вашей команды автоматически появляется следующий список ключей (указан ключ и алиас):

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

Атрибут ‘Parameter’ используется внутри ‘param’. Он используется для проверки (валидации) определенных параметров. Эти проверки могут быть разными: может ли ключ принимать данные с конвейера, какова его максимальна длина, является ли он обязательным и т.д. Блок ‘Parameter’ можно дублировать.

Пример использования (только для демонстрации синтаксиса):

Так как я сам легко путаюсь в понятии параметр, аргумент и атрибут, ниже скриншот с небольшим объяснением:

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

Использование param в файлах

Эта статья рассматривает использования ‘param()’ в функциях т.к. это наиболее популярный способ использования. Тем не менее вы можете поместить этот блок в файл:

Далее мы можем вызвать этот файл и передать в него значения:

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

Если до блока ‘param()’ будет какой-то код (кроме комментариев), произойдет ошибка:

Обязательные Mandatory аргументы

Работая с другими командами Powershell вы замечали, что какие-то параметры являются обязательными к заполнению, а какие-то нет. По умолчанию все параметры опциональны. Что бы сделать их обязательными к заполнению используется аргумент ‘Mandatory’. Обязательность использования параметра указывается в ‘Parameter()’:

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

Если вы не используете параметр явно, то он у вас будет запрошен. Это правило, в случае выше, касается только одного параметра так как он является обязательным.

Обратите внимание, что объявление ‘Mandatory’ не снимает с вас обязанности проверки на корректность переданных данных. Это дает лишь возможность остановить работу функции еще на первоначальном этапе.

Проверка типов и значение по умолчанию

Эта проверка выполняется до объявления переменной.

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

У некоторых типов вы можете добавить скобки ‘[]’. Такой прием говорит, что вы ожидаете получить массив определенных типов. В случае строк ‘[string]’ массив строк будет выглядеть ‘[string[]]’ (ниже пример на числах):

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

Объявить значение по умолчанию мы можем только у аргумента, который не является ‘Mandatory’. Это делается следующим образом:

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

switch

Аналогичным образом мы можем объявить переменную типа switch. Если параметр будет указан, то такая переменна будет иметь значение ‘True’:

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

Такой подход уменьшает риск ошибок и сокращает время на написание команды. Использование switch похоже на bool, но у них есть разница. В случае ‘[bool]’ нужно будет указывать значение параметра.

Разделение параметров на группы с ParameterSetName

В ситуациях, когда в функцию нужно передать разный набор обязательных параметров, мы можем использовать атрибут ParameterSetName. Для примера можно посмотреть на описание синтаксиса команды ‘Get-EventLog’:

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

У нас выводится 2 возможных варианта использования команды. Для каждого из варианта использования команды могут быть определены свои индивидуальные ключи. Именно для этого используется ParameterSetName.

Создадим команду с 2-умя группами. Первая группа ‘Group1’ работает с именами пользователей, а ‘Group2’ только с идентификаторами и требует дополнительно параметра:

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

Группу, которую вы планируете использовать по умолчанию, можно определить в ‘CmdletBinding’ используя атрибут ‘DefaultParameterSetName’:

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

Один ключ может находится в нескольких группах. Для этого, группу, нужно указать в разных ‘Parameter()’. Каждый аргумент, указанный в Parameter, будет действовать для определенной группы. Так, в случае ниже, в одной группе «$Message» является обязательным, а в другой опциональным параметром:

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

Позиционные параметры с Position

При создании команды каждый параметр имеет свою позицию. Эти позиции соответствуют порядку их объявления внутри функции:

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

Такой подход часто используется в обычных командах Powershell. Параметры типа ‘Name’ или ‘ComputerName’ могут работать позиционно, а остальные нет.

Параметры конвейера

Для использования конвейера можно определить несколько аргументов:

Создадим функцию, которая будет принимать оба параметра:

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

Единственный момент, который не оговорен в той статье, ‘ValueFromPipeline’ можно использовать несколько раз, но в определенном случае. Если у вы используете группировку (разделяете параметры на группы) и указываете один из параметров явно:

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

Включаем значения вне параметров с ValueFromRemainingArguments

У вас может быть ситуация, когда вы не можете предусмотреть параметр для конкретного значения. Это так же может быть проблема с ограничением Powershell на 32 параметра. В этом случае вы можете использовать ‘ValueFromRemainingArguments’, который включает все значения не привязанных к каким-то параметрам.

Атрибут ‘ValueFromRemainingArguments’ объявляется следующим образом:

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

Обратите внимание, что порядок в этом случае не важен.

Атрибуты валидации параметров

Значения у параметров могут проходить разные проверки. Для этих проверок существуют разные атрибуты:

Рассмотрим некоторые из этих атрибутов.

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

Ошибки при этом могут быть разными:

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

‘AllowNull()’ работает для типов ‘[array]’ и других типов данных, кроме строк и коллекций. Для них нужно использовать ‘[AllowEmptyString()]’ и ‘[AllowEmptyCollection()]’.

Перед указанием таких атрибутов стоит проверить во что будет преобразован ваш тип данных, например:

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

Подсчет значений

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

Проверка по скрипту

Вы можете создать свою проверку параметров с помощью «ValidateScript». Так вы создадите параметр, который запретит указывать прошедшие даты:

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

Ошибка происходит из-за того, что команда отправляет данные, допустим в 11.1 секунд, а валидация в 11.2. Во втором примере мы добавляем 1 секунду что бы ошибки не было.

Вместо «$PSItem» можно использовать «$_».

Проверка по шаблонам регулярных выражений

Мы можем привязать к параметру проверку на простые регулярные выражения (SupportsWildcards) и расширенные (ValidatePattern). Так мы убедимся, что в параметр передают валидный IP адрес:

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

Ограничение выбора значений с ValidateSet

В некоторых командах есть возможность выбора значений у параметров. Такой выбор осуществляется через кнопку ‘tab’. Вы можете проверить это нажав ‘tab’ в следующей команде:

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

У вас будет выполняться переключение между значениями: Continue, Ignore, Inquire и т.д.

Подобный выбор задается в атрибуте ValidateSet:

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

Если вы укажете значение не прописанное в ‘ValidateSet’, то получите ошибку:

Передача ключей и значений в одной переменной (Splatting)

Обычный вызов команды выглядит следующим образом:

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

Мы можем взять все ключи и значения из этой команды, поместить в hashtable и передать в команду как набор параметров:

Что бы Powershell понял, что мы передаем не одну переменную, а набор ключей и значений, мы должны ее пометить знаком ‘@’:

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

Такой подход называется ‘Splatting’ (брызги) и немного повышает читаемость кода.

Если в hashtable будет находиться дополнительный параметр, который не реализован в команде, то выйдет ошибка:

Обычные массивы так тоже можно передавать, но вы должны знать позиции под которыми должны располагаться значения:

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

Используя splatting, в Powershell 7+, вы можете перезаписывать значения из метода splatting:

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

Алиасы

К параметрам можно привязать алиасы (короткие имена/псевдонимы). Это делается через атрибут ‘Alias()’. Ограничений в количестве атрибутов нет:

Источник

Как создавать команды и функции в Powershell вызывать их и передавать параметры

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

Во время написания программы или скрипта любой начинающий программист столкнется с проблемой где ему нужно повторить код дважды и в этот могут помочь функции в Powershell. Функции так же называют методами и процедурами. Кроме многократного использования они так же полезны для выделения одной части скрипта от другой, хоть она и выполняется один раз. Методы описанные ниже существуют во множестве языках и работают по похожему сценарию.

Навигация по посту

Создание

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

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

Команда не очень сложная, но в скором времени ее надоест писать. Для сокращения этой работы ее можно выделить в отдельную функцию:

Любая функция обязательно должна состоять из трех вещей:

После написания функции она вызывается по имени:

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

Учитывая, что нам может потребоваться получить данные не за последние 14 часов и более чем за 50 дней нам может потребуется изменить ее передав параметры.

Именование

Не обязательно использовать имя такого же плана, как принято в Powershell, то есть вместо «Get-DayLog» можно писать «daylog». Такой подход рекомендуем и является распространенной практикой, который поможет отличить запуск сторонней программы от функции.

Функции в Powershell всегда именуются по следующему признаку. Первое слово это глаголы типа:

Удаленное управление через Powershell

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

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

Параметры функции обозначаются в круглые скобки и пишутся после названия функции и до выражения.

Теперь, для вызова функции, требуется передавать два параметра:

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

Установка значений по умолчанию

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

Мы должны всегда указывать ключ param2, что добавляет немного работы. Что бы это исправить достаточно поменять их местами:

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

Как видно на примере, если мы не указываем ключи param1 и param2 важна последовательность, так как именно в такой последовательности они будут присвоены переменным внутри функций.

Возвращение значений

Это будет работать до тех пор, пока мы не решим изменить функцию присвоив переменные:

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

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

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

Я бы рекомендовал всегда возвращать значения через return, а не использовать вывод используя команды типа Write-Output внутри функции. Использование return останавливает работу функции и возвращает значение, а это значит что его не стоит ставить по середине логики если так не планировалось.

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

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

Я вернул оба значения разделив их запятой. По умолчанию всегда возвращается массив. Массивы в Powershell это набор не именованных параметров. Более подробно о них мы уже писали.

В случае с массивами, что бы добавит надпись о зарплате, и налоге нужно использовать индексы:

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

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

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

Подробно о хэш таблицах в Powershell вы можете почитать в предыдущих статьях. Далее так же будет несколько примеров с ними.

Вы можете возвращать любой тип данных и в любом формате и последовательности. Каждый из них имеет своё преимущество.

Область видимости переменных

Все переменные объявленные до момента вызова функции могут быть ей использованы:

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

Такой подход не запрещает переопределить переменную внутри функции дав ей другое значение:

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

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

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

Дополнительные возможности работы с параметрами

Строгие типы данных

Powershell автоматически преобразует типы данных. В отличие от других языков результат этого выражения будет число 3, а не «111»:

Такой подход может привести к ошибке. Мы можем исправить это объявляя типы:

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

То есть объявляя типы данных мы либо получим ошибку избежав неверного преобразования. Если бы мы передавали такую строку «1», то у нас корректно выполнилось преобразование в число.

Таких типов данных в Powershell всего 13:

Примеры работы с некоторыми типами данных вы увидите далее.

В языках программирования есть понятие позиционного параметра. Это такие параметры, которые могут передаваться без имен:

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

Обязательные параметры Mandatory

Попробуем выполнить следующий пример, который должен вернуть дату изменения файла:

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

Представьте что до получения даты изменения файла будут еще какие-то действия, например удаление и создание файлов, которые могут привести к поломке компьютера или программы. Что бы этого избежать можно объявить этот параметр обязательным:

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

Атрибут Mandatory обязывает указывать значение. Если оно будет проигнорировано, то мы получим ошибку еще до момента выполнения функции.

Param()

Вы могли видеть функции, которые имеют значение Param(). Это значение так же объявляет параметры. На предыдущем примере это значение использовалось бы так:

Microsoft Рекомендует использовать именно такой синтаксис написания функции, но не обязывает его использовать. Такой синтаксис говорит, что это не просто функция, а командлет.

Создадим скрипт, в котором будет происходить умножение, где добавим несколько обязательных параметров используя синтаксис с Param:

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

Position говорит под каким номером передается значение.

CmdletBinding()

Использование этого атрибута позволяет расширять возможность по созданию командлетов. Microsoft пишет, что использование CmdletBinding или Parameter расширяет возможность функций в Powershell, но по моему опыту не всегда все срабатывает и нужно ставить оба атрибута.

На примере ниже я установил ограничение на длину строк с 1 по 13 символов с помощью ValidateLength(1,13). Position=1 говорит об индексе элемента в массиве:

Таких дополнительных аргументов для команд достаточно много. Для примера еще несколько атрибутов, которые можно добавить в блок parameter:

Отдельные блоки типа [ValidateLength]:

Больше примеров и аргументов на сайте Microsoft.

Использование массивов

Передача массивов в виде параметров

В предыдущих статьях было множество примеров по работе с массивами и хэш таблицами. Их же, как и любой другой тип данных, мы можем передавать в функцию. Для примера все команды Powershell, которые имеют ключ ComputerName, могут выполняться удаленно. Большинство таких команд могут принимать в виде значений массивы, то есть нам не обязательно передавать поочередно имена компьютеров.

Функция будет принимать массив с именами компьютеров и возвращать все остановленные сервисы. Я так же объявлю этот тип строгим, для наглядности, хотя и без этого в любом случае сработает:

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

Массивы так же работают по индексам, что позволяет передавать больше параметров. Такой способ не релевантный, но может когда-то пригодиться.

Хэш таблицы

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

Знак @ в команде объявляет, что данные хэш таблицы будут использоваться как параметры команды. Важно, чтобы их имена соответствовали настоящим параметрам.

Условия

Нет никаких ограничений на использования условий. Это бывает достаточно удобно, когда функция должна вернуть разные значения.

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

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

Switch

Мы уже говорили про Powershell Switch в предыдущих статьях. Если коротко, то это более удобные условия. Используя предыдущий пример, но со Switch, это будет выглядеть так:

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

Другой пример Switch это вызов функции в зависимости от переданных параметров. На примере ниже я вызываю функцию, в которой находится Switch. В эту функцию я передаю имя компьютера, которое проверяется на упоминание указанных фраз и вызывает соответствующую функцию. Каждая функция, которая устанавливает обновления, возвращает значение в Switch, а затем происходит return внутри нее:

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

Передача через конвейер или Pipeline

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

Если мы захотим использовать подход описанный выше, создав новые команды в виде функций, то конвейер не будет работать:

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

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

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

Таких атрибутов всего два:

Кроме этого, внутри нашей функции, мы должны добавить специальный блок Process. Наш скрипт в итоге будет выглядеть так:

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

Если бы мы не указали блок Process функция бы вернула только последней результат из массива 1..5:

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

Если наши команды будут иметь критический характер, такой как удаление, или через конвейер может передаваться несколько значений, то стоит использовать атрибут ValueFromPipelineByPropertyName. Таким образом мы исключим попадания через конвейер случайного значения. На примере ниже я изменил

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

Как уже писалось ValueFromPipelineByPropertyName принимает только именованные параметры и в случае с именем «bad» мы получаем ошибку:

Причем передавать именованные параметры через хэш таблицы мы не можем, только через pscustomobject.

Вы можете указывать сразу два атрибута таким образом:

Это позволит использовать и значение с именем, если оно указано либо без него. Это не спасет вас от ситуации, если вы передаете параметр с другим именем:

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

Передача через конвейер нескольких значений

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

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

Комментарии, описание и synopsis

При вызове справки на любой командлет мы получим такую информацию:

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

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

powershell передача параметров в функцию. Смотреть фото powershell передача параметров в функцию. Смотреть картинку powershell передача параметров в функцию. Картинка про powershell передача параметров в функцию. Фото powershell передача параметров в функцию

Некоторые виды описаний, например Examples, можно использовать несколько раз.

Как перезагрузить компьютер удаленно через Powershell

Сохранение, загрузка и импорт

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

Импорт на множество компьютеров

Если это командлет, который будет использоваться на множестве компьютеров или вы его планируете использовать короткое время, то скрипт можно сохранить в файл с расширением «.ps1». Загрузка такой функции будет выполняться так:

После выполнения этой команды мы сможем использовать нашу функцию.

Минус такого способа в том, что нужно будет делать каждый раз после закрытия консоли (сессии).

Такой подход хорошо подходит в удаленных сценариях, когда на компьютерах пользователей нужно сделать какую-то работу.

Загрузка как модуля

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

Первое что нужно сделать это получить пути окружения Powershell:

Выберете один из путей, где лежат модули или перейдите по следующему:

В указанной папке Modules вам нужно создать папку и файл с одинаковыми именами. Файлу добавляете расширение «.psm1» и помещаете в него свой скрипт.

В моём случае путь выглядит так:

После этого закройте все окна Powershell и откройте заново. Модуль будет импортироваться автоматически. Проверти что он загружен можно с помощью команды:

Источник

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *