Подтвердить что ты не робот

Что такое [cmdletbinding()] и как это работает?

Согласно get-help about_Functions_CmdletBindingAttribute

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

Мы можем использовать его в верхней части наших скриптов. Какова функция в этом случае? Внутренняя неявная "основная" функция, вызываемая механизмом PowerShell для всех его входов?

Что касается этого синтаксиса:

[CmdletBinding(ConfirmImpact=<String>,
                     DefaultParameterSetName=<String>,
                     HelpURI=<URI>,
                     SupportsPaging=<Boolean>,
                     SupportsShouldProcess=<Boolean>,
                     PositionalBinding=<Boolean>)]

Что мы делаем? cmdlbinding объекта cmdlbinding и передача списка аргументов его конструктору? Этот синтаксис можно найти в param() - например: [Parameter(ValueFromPipeline=$true)]. Имеет ли этот синтаксис конкретное имя, и его можно найти в другом месте?

Наконец, можем ли мы, как простые PowerShellers, имитировать эту функцию и изменять поведение сценариев, устанавливая атрибут?

4b9b3361

Ответ 1

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

Когда вы вызываете их через, например, [CmdletBinding()] вы инициализируете новый экземпляр класса.

Подробнее о классе CmdletBindingAttribute: MSDN

Подробнее о классе ParameterAttribute: MSDN

Подробнее о классах атрибутов здесь и здесь

Ответ 2

Вообще говоря, CmdletBinding - это функция из функции Advanced. Поместите его вверху script, чтобы сделать script "расширенным" script. Функции и сценарии практически одинаковы, где имя файла script эквивалентно имени функции, а содержимое script эквивалентно сектору scripblock функции.

Атрибуты CmdletBinding дают вам возможность управлять функциями функций, такими как добавление поддержки Confirm и WhatIf (через SupportsShouldProcess), отключить привязку параметров к позициям и т.д.

Ответ 3

Что касается вопроса синтаксиса, формат тесно соответствует тому, как вы применяете класс атрибута .NET к члену, используя именованные параметры в С#.

Сравните (упрощенную) грамматику для атрибутов из раздела B.2.4 Спецификация языка PowerShell с тем, что из раздел C.2.13 Спецификация языка С#:

B.2.4 Атрибуты (PowerShell)

Атрибут:
[ атрибут-имя ( атрибут-аргументы ) ]

атрибут-аргументы:
атрибут-аргумент
атрибут-аргумент , атрибут-аргументы

атрибут-аргумент:
простое имя = выражение


C.2.13 Атрибуты (С#)

Атрибут:
[ имя-атрибута ( named-argument-list ) ]

именованных аргументов список:
именованные аргументы
named-argument-list , named-argument

именованных аргументов:
идентификатор = атрибут-аргумент-выражение



Я согласен, что это могло бы быть приятно из чувства концептуальной краткости, например. повторное использование синтаксиса инициализации хеш-таблицы для инициализации атрибута. Тем не менее, я могу представить, что поддерживаю все опции из хэш-таблиц (например, [A(P=v)] и [A('P'=v)] и $n = 'P'; [A($n=v)] и т.д., Или какое-то определенное их подмножество) просто использовать ;, поскольку символ разделителя был бы больше проблем, чем это стоило.

С другой стороны, если вы хотите использовать расширенные функции, возможно, имеет смысл изучить расширенный синтаксис:)