2013-02-03 11 views
27

Uso regolarmente lo [cmdletbinding()] nelle mie funzioni o script ma ho sempre trovato queste cose esoteriche, forse alcuni di voi possono condividere le loro luci.
Secondo get-help about_Functions_CmdletBindingAttributecosa è [cmdletbinding()] e come funziona?

L'attributo CmdletBinding è un attributo di funzioni che rende loro operare come cmdlet compilati

ma possiamo usarlo in cima ai nostri script, qual è la funzione in questo Astuccio ? una funzione "principale" implicita interna chiamata dal motore ps per tutti i suoi input?

sulla sintassi ora:

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

cosa stiamo facendo? istanziare un oggetto cmdlbinding e dare una lista di argomenti al suo costruttore? questa sintassi può essere trovata in param(), ad esempio [Parameter(ValueFromPipeline=$true)] questa sintassi ha un nome particolare e può essere trovata altrove?

finalmente, siamo in grado, come semplici powerheller, di imitare questa funzionalità e modificare il comportamento degli script impostando un attributo?

+4

Credo documenti sono po 'fuorviante qui: tutto questo è legato a qualsiasi tipo di blocco di script : come menzionato da Shay - nominato per nome funzione, per percorso (script) ma * anche * senza nome, ad es '& {[CmdletBinding()] param() Write-Verbose 'Foo'} -Verbose' funziona come un campione. – BartekB

+0

@BartekB grazie ok per la prima parte della domanda. –

risposta

11

CmdletBinding, Parameter ecc. Sono classi di attributi speciali che gli scripters possono utilizzare per definire il comportamento di PowerShell, ad es. rendere una funzione una funzione avanzata con capacita 'Cmdlet.

Quando li chiami per es. [CmdletBinding()] si inizializza una nuova istanza della classe.

Per saperne di più sulla classe CmdletBindingAttribute a: MSDN

Per saperne di più sulla classe ParameterAttribute a: MSDN

più su classi di attributi here e here

+0

OK. Quindi, quando si utilizza la sintassi completa, si passa una tabella hash al costruttore che verrà utilizzato per impostare i valori dei membri pubblici? –

+0

in un modo. le hashtables sono separate da ';'. Penso che questo sia un tipo speciale di classe e modo di costruire che il processo di PowerShell può usare.Potresti pensarci come per es. 'nuova domanda {Testo =" Qualche domanda "};' in C# credo. Se vuoi sapere come funziona, puoi provare a decompilare la Libreria specificata nel mio link MSDN e vedere se è leggibile. –

+0

sì tipo di tabella hash :). –

5

In generale, CmdletBinding è ciò che rende una funzione da una funzione avanzata. Mettendolo in cima a uno script, lo script è "avanzato". Le funzioni e gli script sono più o meno gli stessi, dove il nome del file di script è equivalente al nome della funzione e il contenuto dello script è equivalente alla sezione scripblock di una funzione.

Gli attributi CmdletBinding consentono di controllare le funzionalità delle funzioni, ad esempio aggiungendo il supporto Confirm e WhatIf (tramite SupportsShouldProcess), disabilitano il binding posizionale dei parametri e così via.

+0

Ciao Shay, mi sto interrogando sui modi interni di operare ... –

2

Per quanto riguarda la questione della sintassi, il formato corrisponde da vicino come si applica una classe di attributi .NET a un membro utilizzando i parametri denominati in C#.

Confrontare la grammatica (semplificato) per gli attributi dalla sezione B.2.4 di The PowerShell Language Specification con quella dalla sezione C.2.13 del C# Language Specification:

B.2.4 Attributi   (PowerShell)

attributi:
  [nome_attributo(attributi argomentazioni) ]

attributi-argomenti
  attributo-argomenti
  attributo-argomento
,argomenti-attributo

attributo-argomento:
  semplice nome
=espressione


C.2.13 Attributi   (C#)

attributo:
  [attr ibute-name(nome-argomento-lista) ]

nome-argomento-list:
  nome-argomento
  nome-argomento-lista
,nome-argomento

named- argomento:
  identificatore
=attributo-argomento-espressione



Sono d'accordo che sarebbe stato bello da un senso di brevità concettuale esempio riutilizzare la sintassi di inizializzazione hashtable per l'inizializzazione degli attributi. Tuttavia, posso immaginare di supportare tutte le opzioni di hashtables (come [A(P=v)] e e $n = 'P'; [A($n=v)] e simili, o qualche particolare sottoinsieme di esse) solo per usare ; in quanto il carattere separatore sarebbe stato più difficile di quanto valesse.

D'altra parte, se si desidera utilizzare le funzioni avanzate, allora forse ha senso per imparare una sintassi avanzata :)

+0

attributi non supportano la sintassi tabella hash, perché non hanno a che fare con chiavi e valori normali. Le chiavi corrispondono a proprietà ben definite in classi che estendono 'System.Attribute'. – Zenexer

+0

@Zenexer: Questo è un argomento a supporto della sintassi di tipo C#, ma non pone un vincolo sul linguaggio. Allo stesso modo, posso definire un hashtable '$ h = @ {foo = 2}' e accedere all'elemento con la sintassi della proprietà '$ h.foo', anche se l'hashtable non ha una proprietà" foo ". In un caso, i designer del linguaggio hanno scelto una sintassi flessibile e, nell'altro, hanno scelto di supportare una sintassi più semplice. –

+0

C'è sicuramente un certo grado di design del linguaggio, ma ricorda che PowerShell si trova su .NET. Gli attributi di PowerShell sono attributi .NET, quindi devono seguire le regole degli attributi .NET. Sarebbe certamente possibile estendere gli attributi .NET e fornire una versione specifica di PowerShell, ma ci deve essere un modo per definire gli attributi .NET a causa della natura di PowerShell. – Zenexer

Problemi correlati