Параметры PowerShell: управление вводом ваших скриптов

Опубликовано: 1 Марта, 2023
Параметры PowerShell: управление вводом ваших скриптов

При кодировании сценариев PowerShell важной частью является определение и проверка параметров, необходимых для правильной работы. В PowerShell есть несколько опций, помогающих ИТ-специалистам контролировать вводимые данные и избавлять тонны кода от проверки во время выполнения. Мы собираемся предложить несколько простых сценариев, к которым мы можем обратиться в разделе параметров скрипта. Хотя мы не собираемся ничего кодировать в сценарии, давайте воспользуемся простым сценарием: у нас есть сценарий для защиты виртуальных машин Azure, и мы хотим, чтобы пользователь предоставил имя виртуальной машины, и если он или она хочет защитить или восстановить любую заданную ВМ.

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

Начало работы с разделом Param()

Первое, что нам нужно сделать, это определить раздел Param(). Этот раздел должен быть в верхней части вашего скрипта. Наш дизайн заключается в том, что помимо имени виртуальной машины пользователь должен предоставить либо резервную копию, либо восстановление.

Мы можем начать просто с определения имени параметров и определения их типов. В приведенном ниже примере нам нужна строка для $VMName, а защита и восстановление будут типом переключателя.

Мы можем видеть, как это ощущается конечными пользователями при использовании переключателя и строки. Когда я пытаюсь передать -VMName без какой-либо строки, скрипт выдает мне ошибку. Если я сделаю то же самое для параметра-переключателя (в нашем случае -protect), все пойдет хорошо.

Параметр ([строка]$VMName, [переключатель]$защита, [переключатель]$восстановление)

Принудительный параметр

В нашем скрипте мы должны знать имя ВМ. В противном случае мы не сможем даже начать свою деятельность. Мы можем сделать параметр обязательным, внеся небольшое изменение в начале строки, которую мы определили в $VMName в предыдущем разделе.

Param ( [Параметр(Обязательный=$true)][строка]$VMName, [переключатель]$защита, [переключатель]$восстановление )

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

Если вы хороший человек и хотите сделать доброе дело для пользователей вашего кода, вы можете использовать HelpMessage, чтобы предоставить краткое объяснение того, что вы ищете по этим конкретным параметрам. Обновленный код указан ниже.

Param ( [Parameter(Mandatory=$true,HelpMessage="Имя ВМ в текущей подписке Azure")][string]$VMName, [switch]$protect, [switch]$restore )

В качестве конечного пользователя, когда вы запускаете сценарий без указания параметров, потребуется имя VMName (поскольку мы настроили его как обязательное). Однако мы можем ввести !? и будет отображаться HelpMessage, который мы настроили. Код скрипта и действие, которое мы только что описали, изображены на изображении ниже.

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

У некоторых пользователей есть свой способ обращения к объекту, и вы можете удовлетворить эти типы запросов, используя псевдоним. Мы можем назначить несколько имен, которые, по нашему мнению, наши конечные пользователи могут использовать вместо VMName в качестве параметра.

В нашем примере ниже я добавил виртуальную машину, машину, инопланетянина и ЧупаКабру. Пока некоторые из них введены, все они будут храниться в переменной $VMName.

Примечание. Псевдоним не отображается в автозаполнении. Когда пользователь вводит - и нажимает <tab>, будут отображаться только имена параметров.

Param ( [Parameter(Mandatory=$true,HelpMessage="Имя ВМ в текущей подписке Azure")][Alias("VirtualMachine","Machine","Alien","CupaCabra")][string]$VMName, [переключатель]$защита, [переключатель]$восстановление ) Write-Host $VMName

Проверка параметра PowerShell на лету

Мы можем использовать интеллектуальные проверки, используя атрибут ValidateScript. Предположим, что у нас нет имени виртуальной машины, состоящего менее чем из пяти (5) символов, мы можем использовать [ValidateScript({($_).Length -gt 4})] для проверки этого во время ввода параметров, и это сэкономит нам некоторую строку кода в сценарии для проверки в будущем.

Мы добавляем слишком много атрибутов в $VMName, поэтому отличный способ упорядочить — добавить по одному атрибуту на строку. Контент тот же, что мы использовали, только в другом формате.

Param ( [Parameter(Mandatory=$true,HelpMessage="Имя ВМ в текущей подписке Azure")] [Alias("VirtualMachine","Machine","Alien","ChupaCabra")] [ValidateScript({($ _).Length -gt 4})] [string] $VMName, [switch]$protect, [switch]$restore ) Write-Host $VMName

Простой и еще более крутой пример — совместить с проверкой вашей среды в реальном времени в Microsoft Azure. В приведенном ниже коде мы проверяем, действительно ли существует виртуальная машина. Если это не так, то нам даже не нужно выполнять скрипт.

Param ( [Parameter(Mandatory=$true,HelpMessage="Имя ВМ в текущей подписке Azure")] [Alias("VirtualMachine","Machine","Alien","ChupaCabra")] [ValidateScript({Get- AZVM -Name ($_)})] [строка] $VMName, [переключатель]$защита, [переключатель]$восстановление ) Write-Host $VMName

Проверка параметров переключателя

На данный момент у нас есть надежный $VMName. Наш следующий шаг — понять, какие параметры резервного копирования/восстановления предоставляет конечный пользователь.

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

Param ( [Parameter(Mandatory=$true,HelpMessage="Имя ВМ в текущей подписке Azure")] [Alias("VirtualMachine","Machine","Alien","ChupaCabra")] [ValidateScript({($ _).Length -gt 4})] [строка] $VMName, [переключатель]$защита, [переключатель]$восстановление ) $PSBoundParameters

Если мы знаем, что у нас есть хеш-таблица со всеми данными, поступающими из командной строки. Мы точно знаем, что одним параметром будет VMName. Мы сделали это обязательным, чтобы технически пользователь мог добавить еще два параметра.

Если мы видим, что число параметров больше двух ( gt означает больше чем ) два, предполагается, что конечный пользователь ввел -protect и -restore. Мы выполнили все возможные сценарии и видим результаты в действии.

Если пользователь пытается использовать два параметра и не учитывает параметры VMName, обязательная опция защитит нас.

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

Param ( [Parameter(Mandatory=$true,HelpMessage="Имя ВМ в текущей подписке Azure")] [Alias("VirtualMachine","Machine","Alien","ChupaCabra")] [ValidateScript({($ _).Length -gt 4})] [строка] $VMName, [переключатель]$protect, [переключатель]$restore ) If ($PSBoundParameters.Count -gt 2) { Write-Host "Слишком много параметров" } Write- Host If ($PSBoundParameters.Keys.Contains("restore")) { Write-Host "Восстановить код..." } If ($PSBoundParameters.Keys.Contains("защитить")) { Write-Host "Защитить код..." } Хост записи

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