Что такое [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, имитировать эту функцию и изменять поведение сценариев, устанавливая атрибут?
Ответы
Ответ 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)]
и т.д., Или какое-то определенное их подмножество) просто использовать ;
, поскольку символ разделителя был бы больше проблем, чем это стоило.
С другой стороны, если вы хотите использовать расширенные функции, возможно, имеет смысл изучить расширенный синтаксис:)