Pagine

venerdì 22 luglio 2011

Powershell – Passare Parametri e Switch dei cmdlet tramite variabile

Molte volte ho scritto pezzi di codice in più solo perché dovevo cambiare qualche piccolo parametro, per farvi un esempio in una funzione che scrive dei log avevo aggiunto anche dei write-host in modo da vedere a video cosa succedeva, ma come cambiare i colori in base al tipo di log generato?
Vediamo un esempio di codice in cui scriviamo un messaggio in base all’esito di un ping.
La Prima soluzione è stata la seguente:



function scrivilog{
        switch ($TipoMsg){
                    "err"{Write-Host  $messaggio -BackgroundColor red}
                    default {Write-Host  $messaggio}
        }#End switch
}

$ip = "172.16.16.11" #Inserire un ip a cui non risponde nulla
$ris = Test-Connection -ComputerName $IP -Count 1 -Quiet
if ($ris -eq $false) {
    $TipoMsg = "err"
    $messaggio = "[ERRORE] non è stato possibile raggiungere la macchina "
    scrivilog
}else{
$messaggio = "[OK] è stato possibile raggiungere la macchina"
scrivilog
}



Quindi, dicevo alla funzione che tipo di errore volevo stampato a video tramite la variabile $TipoMsg,
Non sempre questo genere di approccio risulta efficace, quindi ho dovuto trovare una soluzione, qualcosa che mi permettesse di rendere dinamici i parametri espressi in un cmdlet.
Vediamo come passare ad un comando powershell dei parametro espressi in una variabile.

Parametri in una variabile.
1) Scriviamo i parametri all’interno di una variabile
        $param = "messaggio -BackgroundColor red"
2) Utilizziamo il cmdlet invoke-expression per eseguire il comando
Invoke-expression –command "write-host $param"
Quindi la porzione di codice che abbiamo scritto prima diventerebbe:

function scrivilog{
        Invoke-Expression -Command "Write-Host  $messaggio"
}

$ip = "172.16.16.10"
$ris = Test-Connection -ComputerName $IP -Count 1 -Quiet
if ($ris -eq $false) {

    $messaggio = "[ERRORE] non è stato possibile raggiungere la macchina -BackgroundColor red"
    scrivilog
}else{
    $messaggio = "[OK] è stato possibile raggiungere la macchina -BackgroundColor green"
    scrivilog
}



Come noterete ho espresso direttamente nella variabile $messaggio i parametri del cmdlet write-host e il cmdlet invoke-expression ha fatto si che write-host interpretasse correttamente quei parametri senza stamparli a video come se fossero parte del messaggio.

Nessun commento:

Posta un commento