Estrarre le enum per SQL Server SMO con Powershell
Lavorare con le enum in Powershell non è molto comodo, la sintassi è prolissa e ricordarsi i valori da associare non è così semplice (certo c'è sempre il sito MSDN ...).
Basandomi sul codice di questo articolo di $hay@Israel, ho creato questa variazione per estrarre le enum per SQL Server Server Management Objects (SMO), ... ma non solo.
Il codice in realtà permette potenzialmente di stampare tutte le enum presenti in un qualsiasi Assembly .Net, oppure solo una porzione di esse usando un parametro di filtro (Es: *Database*, ).
Partiamo dal primo spunto, preso quasi integralmente dal post di $hay@Israel:
function Get-EnumValues{
if ($args.Count -eq 0) {
write-warning "`nEnum parameter is empty. Nothing to Get"
} else {
[enum]::getvalues($args[0]) | select @{n='Name';e={$_}},@{n='Value';e={$_.value__}} | ft -auto
}
}
Possiamo usare questa funzione per estrarre tutti i valori da una specifica enum:
Get-EnumValues System.ConsoleColor
Get-EnumValues System.IO.FileAttributes
Get-EnumValues System.IO.FileAccess
Get-EnumValues System.IO.FileOptions
Ora scriviamo una funzione un pò più sofisticata, per estrarre tutte le enum da un Assembly, eventulamente passando un filtro e i classici $Verbose e $Confirm di Powershell (che andrebbero sembre gestici anche nelle proprie funzioni):
function Get-AllEnumValues (
[String] $Assmbl = $(throw 'Mandatory Assembly name parameter is missing'),
[String] $eFilter = '',
[switch] $Verbose = $False,
[switch] $Confirm = $True
) {
if ( $eFilter -ne '') {
$local:filter={$_.basetype.fullname -eq 'system.enum' -and $_.name -like $eFilter}
if ($Verbose) {
write-host "eFilter = $eFilter"
}
} else {
$local:filter={$_.basetype.fullname -eq 'system.enum'}
if ($Verbose) {
write-host "eFilter = ''"
}
}
if ($Verbose) {
write-host "Assembly = $Assmbl"
}
[System.Reflection.Assembly]::LoadWithPartialName($Assmbl).gettypes() | ? {& $Filter} | % {
write-host "`t--- [$_] ---"
Get-EnumValues $_
if ($Confirm) {
read-host " Press any key to continue"
}
}
}
Ora non ci resta che scrivere una funzione accessoria che usa la precedente, per estrarre le enum da specifici assembly che magari usiamo spesso:
function Get-SMOEnumValues (
[String] $eFilter = '',
[switch] $Verbose = $False,
[switch] $Confirm = $False
) {
Get-AllEnumValues 'Microsoft.SqlServer.SqlEnum' $eFilter -Confirm:$Confirm -Verbose:$Verbose
}
Ora possiamo scrivere ad esempio:
Get-SMOEnumValues # o Get-SMOEnumValues *
Get-SMOEnumValues Job*
Get-SMOEnumValues *Status
Ovviamente questo può essere esteso ad altri Assembly, a piacere:
function Get-SDEnumValues (
[String] $eFilter = '',
[switch] $Verbose = $False,
[switch] $Confirm = $False
) {
Get-AllEnumValues 'System.Data' $eFilter -Confirm:$Confirm -Verbose:$Verbose
}
Get-SDEnumValues *Command* -Confirm:$True -Verbose:$True
Il codice completo di esempio è disponibile qui.
Claudio