Come utilizzare l'attributo CmdletBinding in PowerShell
-
Attributo
CmdletBinding
in PowerShell -
Utilizza l’attributo
CmdletBinding
con il parametroVerbose
-
Utilizza l’attributo
CmdletBinding
con l’oggetto$PSCmdlet
eSupportsShouldProcess
-
Utilizza l’attributo
CmdletBinding
con l’attributoParameter
per controllare i parametri della funzione

Il cmdlet
è uno script leggero che svolge una singola funzione all’interno dell’ambiente PowerShell. I cmdlet
possono essere scritti in qualsiasi linguaggio .Net
.
Di solito, un cmdlet
è espresso come una coppia verbo-nome per eseguire un comando. Il comando è un ordine al sistema operativo sottostante di eseguire un servizio specifico da parte dell’utente finale.
L’ambiente PowerShell include più di 200 cmdlet
di base come New-Item
, Move-Item
, Set-Location
e Get-Location
. I cmdlet
condividono un insieme comune di caratteristiche non disponibili nelle semplici funzioni PowerShell.
- Supporta parametri comuni come
-WhatIf
,ErrorAction
,Verbose
, ecc. - Richiesta di conferma
- Supporto dei parametri obbligatori
Attributo CmdletBinding
in PowerShell
La semplice funzione PowerShell può essere scritta come una funzione avanzata ereditando le caratteristiche di base del cmdlet
discusse sopra. L’attributo CmdletBinding
ti consente di accedere a queste caratteristiche di base del cmdlet
.
Di seguito viene mostrata la sintassi dell’attributo CmdletBinding
con tutti i possibili argomenti.
{
[CmdletBinding(ConfirmImpact = <String>,
DefaultParameterSetName = <String>,
HelpURI = <URI>,
SupportsPaging = <Boolean>,
SupportsShouldProcess = <Boolean>,
PositionalBinding = <Boolean>)]
Param ($myparam)
Begin {}
Process {}
End {}
}
Diciamo di avere una semplice funzione PowerShell chiamata Helloworld-To-UpperCase
.
Function Helloworld-To-UpperCase {
"helloworld".ToUpper();
}
Non ci sono parametri attaccati a questa funzione. Quindi, questa è chiamata una semplice funzione PowerShell.
Ma possiamo usare l’attributo CmdletBinding
per convertire questa funzione in una avanzata e accedere alle caratteristiche e ai parametri di base del cmdlet
, come mostrato di seguito.
Function Helloworld-To-UpperCase {
[CmdletBinding()]Param()
"helloworld".ToUpper();
}
Quando chiamiamo la funzione sopra con il parametro -verbose
, stamperà tutte le stringhe Write-Verbose
nella finestra di PowerShell.
HelloWorld-To-UpperCase -Verbose
Output:
Utilizza l’attributo CmdletBinding
con l’oggetto $PSCmdlet
e SupportsShouldProcess
Poiché abbiamo utilizzato l’attributo CmdletBinding
, la nostra funzione avanzata può accedere all’oggetto $PSCmdlet
senza problemi. Questo oggetto contiene diversi metodi come ShouldContinue
, ShouldProcess
, ToString
, WriteDebug
, ecc.
Utilizza l’attributo CmdletBinding
con il metodo ShouldContinue
Questo metodo consente agli utenti di gestire le richieste di conferma. Nel frattempo, è obbligatorio impostare l’argomento SupportsShouldProcess
su $True
.
Il metodo ShouldContinue
ha diversi metodi sovraccaricati, e utilizzeremo quello con due parametri.
Function Helloworld-To-UpperCase {
[CmdletBinding(SupportsShouldProcess = $True)]Param()
Write-Verbose "This is the common parameter usage -Version within our Helloworld-To-UpperCase function"
if ($PSCmdlet.ShouldContinue("Are you sure on making the helloworld all caps?", "Making uppercase with ToUpper")) {
"helloworld".ToUpper();
}
Else {
"helloworld kept in lowercase."
}
}
Possiamo chiamare la funzione con il parametro -Confirm
, e mostrerà una casella di conferma come mostrato di seguito.
HelloWorld-To-UpperCase -Confirm
Output:
Se l’utente fa clic su Sì
, dovrebbe implementare il metodo nel blocco if
e stampare la stringa helloworld
in lettere maiuscole.
In caso contrario, dovrebbe mostrare il messaggio helloworld mantenuto in minuscolo
.
Utilizza l’attributo CmdletBinding
con l’attributo Parameter
per controllare i parametri della funzione
Facciamo in modo che la nostra funzione avanzata prenda un parametro come stringa.
Function Helloworld-To-UpperCase {
[CmdletBinding(SupportsShouldProcess = $True)]
Param([string]$word)
Write-Verbose "This is the common parameter usage -Version within our Helloworld-To-UpperCase function"
if ($PSCmdlet.ShouldContinue("Are you sure on making the helloworld all caps?", "Making uppercase with ToUpper")) {
$word.ToUpper();
}
Else {
"helloworld kept in lowercase."
}
}
Abbiamo cambiato la funzione Helloworld-To-UpperCase
per prendere un parametro di tipo stringa chiamato $word
. Quando la funzione viene chiamata, dobbiamo fornire una stringa come argomento.
Il testo fornito verrà convertito in maiuscolo. Se l’utente non ha fornito alcun argomento testuale, la funzione restituirà un output vuoto.
Possiamo controllare questo rendendo il parametro $word
obbligatorio e dando la posizione del parametro 0
.
Function Helloworld-To-UpperCase {
[CmdletBinding(SupportsShouldProcess = $True)]
Param(
[Parameter(
Mandatory = $True, Position = 0
) ]
[string]$word
)
#Verbose
Write-Verbose "This is the common parameter usage -Version within our Helloworld-To-UpperCase function"
#If/Else block for request processing
if ($PSCmdlet.ShouldContinue("Are you sure on making the helloworld all caps?", "Making uppercase with ToUpper")) {
$word.ToUpper();
}
Else {
"helloworld kept in lowercase."
}
}
Abbiamo aggiunto alcuni flag per controllare il comportamento del parametro $word
. Poiché è obbligatorio, dobbiamo fornire un valore stringa quando la funzione viene eseguita.
HelloWorld-To-UpperCase -Confirm "stringtouppercase"
PowerShell continua a chiedere questo se non forniamo l’argomento di testo.
Puoi utilizzare diversi flag per controllare i parametri nelle tue funzioni, come mostrato nella seguente sintassi dell’attributo Parameter
.
Param
(
[Parameter(
Mandatory = <Boolean>,
Position = <Integer>,
ParameterSetName = <String>,
ValueFromPipeline = <Boolean>,
ValueFromPipelineByPropertyName = <Boolean>,
ValueFromRemainingArguments = <Boolean>,
HelpMessage = <String>,
)]
[string[]]
$Parameter1
)
Nimesha is a Full-stack Software Engineer for more than five years, he loves technology, as technology has the power to solve our many problems within just a minute. He have been contributing to various projects over the last 5+ years and working with almost all the so-called 03 tiers(DB, M-Tier, and Client). Recently, he has started working with DevOps technologies such as Azure administration, Kubernetes, Terraform automation, and Bash scripting as well.