Programming Notes
Think it, Code it, Run it    moschini.cloud  

Esempi con PowerShell - 2
Data pubblicazione: 09 dicembre 2022

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:

Message Box

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:

Testo

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 a Out-File per scrivere il file proc.html.