Esempi di script con PowerShell - 2
Visualizzare una message box
Con PowerShell è possibile visualizzare informazioni tramite finestre, ad esempio utilizzando una message box.
Con l'esempio che segue, visualizziamo una semplice message box con il solo pulsante di conferma:
Add-Type -AssemblyName PresentationFramework
$msgBoxInput = [System.Windows.MessageBox]:: Show('Questa è un''informazione','Titolo','Ok','Info')
Output:
Vediamo, nel dettaglio, le due istruzioni utilizzate.
La prima:
Add-Type -AssemblyName PresentationFramework
serve ad aggiungere l'assembly PresentationFramework
all'interno della sessione PowerShell.
All'interno dell'assembly, è definito il namespace System.Windows
che contiene l'implementazione della classe MessageBox
.
La seconda istruzione:
$msgBoxInput = [System.Windows.MessageBox]:: Show('Questa è un''informazione','Titolo','Ok','Info')
invoca il metodo Show
della classe System.Windows.MessageBox
con i parametri opportuni:
- il primo parametro è una stringa che definisce il testo da visualizzare all'interno della message box
- il secondo parametro è una stringa con il titolo della message box
- il terzo parametro è una stringa che indica i pulsanti da visualizzare nella message box:
- 'OK'
- 'OKCancel'
- 'YesNoCancel'
- 'YesNo'
- infine, il quarto parametro è una stringa che definisce il tipo di icona da visualizzare all'interno della message box:
- 'None'
- 'Error'
- 'Question'
- 'Warning'
- 'Information'
Per le message box che visualizzano più pulsanti, si può memorizzare il tipo di pulsante premuto in questo modo:
Add-Type -AssemblyName PresentationFramework
$msgBoxResponse = [System.Windows.MessageBox]:: Show('Vuoi chidere il programma?','Attenzione','YesNoCancel','Question')
switch ($msgBoxResponse) {
'Yes' {
Write-Host "Hai premuto 'Si'"
}
'No' {
Write-Host "Hai premuto 'No'"
}
'Cancel' {
Write-Host "Hai premuto 'Annulla'"
}
}
Cambiare il colore del testo visualizzato
Per scrivere un messaggio di warning, utilizziamo il cmdlets Write-Warning
:
Write-Warning "Questo è un avviso."
Il testo è visualizzato in giallo.
Per modificare a proprio piacimento il colore del testo visualizzato, si utilizza l'istruzione Write-Host
impostando i parametri -BackgroundColor
e -ForegroundColor
:
Write-Host "Testo con sfondo rosso e colore predefinito" -BackgroundColor Red
Write-Host "Testo con sfondo predefinito e colore giallo" -ForegroundColor Yellow
Write-Host "Testo con sfondo blu e colore verde" -BackgroundColor Blue -ForegroundColor Green
Output:
Riavviare il computer
Per riavviare il computer, si può utilizzare il cmdlets Restart-Computer
:
Restart-Computer
Elencare i processi in esecuzione
Per elencare i processi in esecuzione sul computer, si utilizza:
Get-Process
E' possibile ordinare i processi elencati, ad esempio in base all'utilizzo di memoria decrescente:
Get-Process | Sort-Object –Property ws -Descending
Se i processi sono numerosi, può essere utile limitare la visualizzazione ai primi n
elementi:
Get-Process | Sort-Object –Property ws -Descending | Select –first 5
Utilizzare i numeri in esadecimale o binario
Per convertire un numero esadecimale in decimale, è sufficiente anteporre al numero esadecimale la sequenza 0x
:
$hexValue=0xA3F
$hexValue
Output:
2623
Per convertire un numero da decimale a binario, si può utilizzare:
[Convert]::ToString(1234,2)
Il primo parametro è il numero decimale da convertire.
Utilizzare form custom
Con PowerShell si possono definire oggetti di tipo "WinForm", valorizzando le opportune proprietà.
Al loro interno, le form possono contenere oggetti visuali come pulsanti, text box, label.
Vediamo un esempio:
Add-Type -AssemblyName System.Windows.Forms # riga 1
$NewForm = New-Object Windows.Forms.Form # riga 2
$NewForm.Text = "Esempio Winform" # riga 3
$NewForm.Size = New-Object Drawing.Size @(300,200) # riga 4
$NewForm.StartPosition = "CenterScreen" # riga 5
$Button = New-Object System.Windows.Forms.Button # riga 6
$Button.add_click({Get-Date|Out-Host}) # riga 7
$Button.Text = "Clicca qui" # riga 8
$Button.Location = New-Object System.Drawing.Point(100,70) # riga 9
$NewForm.Controls.Add($Button) # riga 10
$Dialouge = $NewForm.ShowDialog() # riga 11
Analizziamo le singole righe:
riga 1: come abbiamo già visto in uno dei precedenti esempi, questa istruzione serve ad aggiungere l'assembly System.Windows.Forms
all'interno della sessione PowerShell;
riga 2: creazione di un oggetto Windows.Forms.Form
;
riga 3: valorizzazione della proprietà Text
della form;
riga 4: valorizzazione delle dimensioni della form;
riga 5: definizione della posizione in cui sarà visualizzata la form;
riga 6: creazione di un oggetto System.Windows.Forms.Button
;
riga 7: aggiunta del gestore dell'evento click
, il cui codice visualizza la data e l'ora corrente;
riga 8: valorizzazione della proprietà Text del bottone;
riga 9: definisce la posizione del bottone in riferimento alla form;
riga 10: aggiunge il bottone alla form;
riga 11: visualizza la form come una finestra modale.
La form è molto semplice: contiene un bottone la cui pressione visualizza la data e l'ora corrente nel prompt da cui viene eseguito lo script.
Cancellazione della cronologia
Per cancellare la cronologia dei comandi di una sessione PowerShell, il comando da utilizzare è:
Clear-History
Informazioni sui dischi collegati al computer
Per avere le informazioni sui dischi collegati al computer, si utilizza il cmdlets Get-Disk
:
Get-Disk
Get-Disk
elenca i dischi logici; per avere l'elenco dei dischi fisici si utilizza:
Get-PhysicalDisk
Infine, per avere la lista dei volumi:
Get-volume
Effettuare uno screenshot
Con questo script è possibile effettuare lo screenshot del monitor principale:
# Directory che conterrà i file degli screenshot
$Path = "C:\Test"
# Se la directory non esiste, lo notifica e interrompe lo script
If (!(test-path $path)) {
Write-Output "La directory '$path' non esiste."
exit
}
# Aggiunge l'assembly alla sessione PowerShell
Add-Type -AssemblyName System.Windows.Forms
# Determina le dimensioni dell'immagine nel monitor principale
$screen = [System.Windows.Forms.Screen]::PrimaryScreen.Bounds
# Inizializza l'immagine con le dimensioni pari alla risoluzione dello schermo
$image = New-Object System.Drawing.Bitmap($screen.Width, $screen.Height)
# Crea un oggetto grafico in funzione del contenuto dello schermo
$graphic = [System.Drawing.Graphics]::FromImage($image)
$point = New-Object System.Drawing.Point(0, 0)
$graphic.CopyFromScreen($point, $point, $image.Size);
$cursorBounds = New-Object System.Drawing.Rectangle([System.Windows.Forms.Cursor]::Position, [System.Windows.Forms.Cursor]::Current.Size)
# Effettua lo screenshot
[System.Windows.Forms.Cursors]::Default.Draw($graphic, $cursorBounds)
$screen_file = "$Path\" + $env:computername + "_" + $env:username + "_" + "$((get-date).tostring('yyyy.MM.dd-HH.mm.ss')).png"
# Salva lo screenshot con il formato PNG
$image.Save($screen_file, [System.Drawing.Imaging.ImageFormat]::Png)
# Visualizza il nome del file
Write-Output "Lo screenshot è stato salvato in:"
Write-Output $screen_file
Personalizzare i colori di PowerShell
Per modificare i colori in una finestra PoweShell, è possibile utilizzare questo script:
$Host.UI.RawUI.BackgroundColor="Blue"
$Host.UI.RawUI.ForegroundColor="white"
In questo caso, per il colore di sfondo viene utilizzata il blu, mentre il testo è bianco.
Fermare un processo
Abbiamo già visto il cmdlets Get-Process
per elencare i processi in esecuzione.
Per interrompere un processo, si utilizza il comando Stop-Process
seguito dal parametro -Id <id del processo>
oppure dal parametro -Name <nome del processo>
.
L'id del processo è un'informazione che può essere determinata tramite Get-Process
.
Esempi:
- per terminare tutte le istanze del processo "CalculatorApp" (calcolatrice):
Stop-Process -Name "CalculatorApp"
- per terminare una particolare istanza di un processo, occorre utilizzare il suo Id:
Stop-Process -id 12345
Convertire in HTML
E' possibile convertire in HTML le informazioni fornite da PowerShell come risultato dell'esecuzione di comandi. Ad esempio, per avere una pagina in formato HTML con l'elenco dei processi in esecuzione, è possibile utilizzare questo comando:
Get-Process | ConvertTo-Html -Property Name, Path, Company -Title "Process Information" | Out-File proc.html
Vediamo nel dettaglio cosa succede:
- il primo comando eseguito è
Get-Process
che ritorna l'elenco dei processi attivi; - il risultato viene inviato al comando
ConvertTo-Html
tramite|
, il quale estrae le informazioni specificate da-Property
e le utilizza per creare una tabella HTML con il titolo indicato dal parametro-Title
; - infine, il risultato del comando
ConvertTo-Html
viene inviato aOut-File
per scrivere il fileproc.html
.