2013-08-27 9 views
11

Se creo una semplice funzione PowerShell, ad es.Perché i cmdlet con script sono elencati come funzioni?

Function Hello { 
    [CmdletBinding()] 
    Param (
     [parameter()] 
     $Name 
    ) 
    Begin{} 
    Process{ 
     Write-Output "Hello $Name" 
    } 
    End{} 
    } 

quindi utilizzare Get-Command per elencare con Get-Command Hello, il cmdlet è elencato come funzione 'CommandType'. Perché non è elencato come cmdlet "CommandType"?

Durante l'esportazione dai moduli, ho anche scoperto che devo usare FunctionsToExport anziché CmdletsToExport.

Non sembra influire sull'uso delle funzioni, sono solo curioso di sapere perché sono elencate in questo modo.

risposta

14

Probabilmente non c'è molta differenza tra una funzione e un cmdlet, ma ciò dipende dalla quantità di lavoro che si è disposti a mettere nella scrittura della funzione. Don Jones wrote an article on TechNet indietro quando questi primi uscirono per evidenziare alcune di queste differenze.

Queste funzioni, scritte interamente in script, hanno le stesse funzionalità di un cmdlet "reale" scritto in C# o Visual Basic e compilato in Visual Studio. Queste funzioni avanzate (in origine erano chiamate "script cmdlet" all'inizio del ciclo di sviluppo di v2) consentono di scrivere funzioni più flessibili che è possibile utilizzare in modo continuo insieme ai cmdlet normali.

...

La vera differenza tra una mera funzione e un cmdlet completa è che i cmdlet supportano potenti associazioni di parametri. È possibile utilizzare i parametri posizionali, i parametri denominati, i parametri obbligatori e persino eseguire controlli di convalida dei parametri di base, tutto semplicemente descrivendo il parametro nella shell.

L'esempio di codice che avete offerto già comincia a sfumare i confini tra i due, consentendo una serie di parametri di aggiunta via [CmdletBinding()], e cominciando a descrivere un nuovo parametro chiamato $Name. Ad esempio, ora è possibile utilizzare Write-Verbose ovunque in tale funzione e chiamare il flag -Verbose per visualizzare tali istruzioni senza dover eseguire alcun lavoro aggiuntivo.

Dal punto di vista funzionale, i risultati finali di un cmdlet o di una funzione scritti in PowerShell non devono necessariamente essere molto diversi: sembra più una questione di distinzione dei cmdlet compilati dalle funzioni di script.

Problemi correlati