Come ogni linguaggio di programmazione, PowerShell supporta i commenti. In effetti, supporta due stili di commenti. Tuttavia, come vedrai più avanti in questo articolo, PowerShell può usare i commenti in un paio di modi interessanti e inaspettati che possono essere piuttosto potenti.

Usare i commenti

Lo stile più comune di commento che vedrai è una linea preceduta da un simbolo #. (Lascio a voi decidere se volete chiamarlo hashtag, simbolo del cancelletto, o anche un buon vecchio ottagono!)

Come esempio, potreste avere un blocco di commenti all’inizio del vostro programma con dettagli su di esso:

1
2
3
4
5
6

#Questo è un esempio di commenti alinea di commento
#
#Autore: Greg D. Moore [email protected]
#Data: 2019-11-12
#Versione: 1.0
#

Commenti come questo possono andare ovunque nel vostro codice. Un modo alternativo di farlo, tuttavia, sarebbe più quello che chiamerei uno stile del linguaggio C o a volte indicato come un commento a blocchi:

1
2
3
4
5

<#Questo è un esempio di commento a blocchi
Autore: Greg D. Moore [email protected]
Data: 2019-11-12
Versione: 1.0
#>

Questo stile ti permette di aggiungere più facilmente linee di commenti senza avere un # davanti a ciascuna. Sei libero di usare entrambi gli stili o anche entrambi. Ricordate solo, però, l’utilità dei blocchi di commento come questo quando tornerete a fare il debug del vostro codice tra un anno. Comunque, i commenti non devono nemmeno arrivare all’inizio di una linea. Infatti, personalmente mi trovo ad usare i blocchi di commento come sopra solo all’inizio di uno script o subito prima di un blocco di codice particolarmente complicato. Sono molto più propenso a fare commenti di fine linea come:

1
$Callback_Test_Form.Show() | Out-Null #assorbe il messaggio di cancellazione alla fine. Questo si verifica per ragioni al di fuori dello scopo di questo articolo

Ho incluso questo commento in uno script recente perché il | Out-Null non era qualcosa che mi aspettavo fosse richiesto, e so che tra un anno se non avessi avuto il commento lì mi sarei chiesto perché lo avevo lì. O peggio, l’avrei rimosso e poi mi sarei chiesto perché stavo ricevendo un messaggio di annullamento che continuava a comparire.

Nota che quando inizi un commento con un #, tutto ciò che arriva alla fine della linea è trattato come un commento. Questo può essere utile per esempio quando state facendo dei test e potreste voler commentare la fine di un comando.

1
get-help write-host #Ooops, Non voglio andare -online

Questo permette di rimuovere successivamente il commento e ottenere la –online versione di aiuto, ma cosa succede se si vuole un commento nel mezzo? Di nuovo, PowerShell vi dà questo potere.

1
get-help write-host <# Voglio il più recente, quindi andrò #> -online

Nota che usando un commento in stile blocco, hai la possibilità di avere un commento nel mezzo del tuo comando e comunque eseguire o interpretare gli elementi alla sua destra. Infine, vi starete chiedendo: “e se volessi stampare un # o fare qualcosa di simile? Se provate

1
scrivere-host Premi # sul tuo telefono

Troverai che non scrive quello che vuoi. Si ottiene semplicemente:

Ecco dove l’accento grave ` torna utile.

1
scrivere-host Premi `# sul tuo telefono

Questo stamperà il messaggio che vuoi.

Si potrebbe anche avvolgere l’intera stringa tra virgolette:

1
write-host ‘Premi # sul tuo telefono’

Questo potrebbe funzionare, ma volevo dare un esempio di come sfuggire al qualificatore #.

Se, come me, usate spesso PowerShell ISE per scrivere script, c’è un ultimo trucco utile che voglio condividere, ma che posso solo descrivere e dare alcuni screenshot, non fornire effettivamente uno script. Si tratta di una scorciatoia da tastiera che non è specifica per i commenti, ma utile se avete un pezzo di codice che volete commentare, ad esempio per i test. Mettete il cursore all’inizio della linea e tenendo premuto Shift-Alt usate i tasti freccia per spostarlo su o giù. Noterete una linea sottile (blu sul mio schermo) apparire. Una volta che hai segnato le linee che vuoi commentare, scrivi semplicemente un # e apparirà all’inizio di ogni linea.

Questo è un esempio del codice da commentare:

Cliccando a destra del testo sulla linea 40 e dopo aver premuto Shift-Alt e la freccia su più volte, vedrai la linea blu:

Dopo aver premuto # <space> vedrete i caratteri aggiunti al codice:

Come nota, potete usare questo trucco ovunque sulla linea (quindi se voleste mettere un mucchio di commenti alla fine di un certo numero di linee potreste usare questo trucco per mettere facilmente il # per voi) e ovviamente non è specifico per commentare, ma questo è uno degli usi più ovvi. Potete anche farlo usando le espressioni regolari. Evidenzia il blocco di codice in questione:

Poi Ctrl-H per ottenere la finestra di dialogo Trova e sostituisci. Assicuratevi che Find in Selection e Regular expressions siano selezionati:

Il cursore ^ è usato per ancorare l’inizio di una linea e naturalmente il # (c’è uno spazio) inserisce fondamentalmente un # e uno spazio alla fine delle linee evidenziate. Notate che se non evidenziate un blocco di codice, questo opererà sull’intero script.

And More

Tuttavia, se questo fosse tutto ciò che i commenti possono fare in PowerShell questo sarebbe un articolo molto breve e noioso (e il mio editore scuoterebbe la testa dicendo: “Greg, mi servono più di 850 parole!”) Come molte cose in PowerShell, i creatori hanno aggiunto delle caratteristiche che lo rendono più potente di quanto ci si possa aspettare.

Si stava recentemente preparando per una presentazione che stavo facendo all’Hampton Roads SQL Server User Group. Durante questa presentazione, eseguo uno script in PowerShell che avvia e ferma SQL Server. Per fare questo, ho bisogno di eseguirlo come amministratore. Naturalmente, l’avevo completamente dimenticato durante una pratica, e quando l’ho eseguito come me stesso, ha finito per lanciare diversi brutti errori. Questo non è stato uno showtopper, ma non è quello che si vuole durante una demo. Questo mi ha fatto pensare a come potevo assicurarmi che questo non accadesse durante il discorso vero e proprio.

Il mio primo pensiero è stato quello di trovare qualche cmdlet che controllasse chi era loggato come e poi interrompesse se non ero l’utente giusto. Parte del problema con questo approccio, naturalmente, è che quando si esegue un programma (come PowerShell ISE) come amministratore, ci si presenta come l’utente collegato. Questo sarebbe stato più difficile di quanto pensassi.

Ancora una volta, PowerShell mi ha sorpreso. Risolvere questo problema è banale. Per vedere come risolvere il problema, aprite l’ISE di PowerShell come voi stessi (cioè NON selezionate Esegui come amministratore e assicuratevi che il vostro utente non abbia privilegi di amministratore locale) e inserite il seguente codice:

1
2

stop-servizio “windows time”
start-service “windows time”

Salva questo in un file chiamato restart timer service example.ps1 e poi provate ad eseguirlo. A meno che non siate un amministratore locale sulla vostra macchina, dovreste ottenere una schermata di errore simile alla seguente.

Se lo eseguite usando l’opzione Esegui come amministratore, dovrebbe funzionare senza errori. In questo esempio, il fallimento è abbastanza benigno, ma forse state scrivendo uno script dove un fallimento non sarebbe così innocuo. Per risolvere questo problema, mettete semplicemente il seguente commento all’inizio dello script qui sopra e salvatelo di nuovo.

1
#Richiede -RunAsAdministrator

Ora si ottiene un errore diverso:

È ancora un po’ brutto ma molto meglio che eseguire lo script e forse rompere qualcosa. Notate che se semplicemente tagliate e incollate lo script in una nuova finestra, ma non lo salvate, PowerShell tenterà di eseguire il tutto. Fondamentalmente il #requires viene ignorato a meno che non sia un vero e proprio file salvato. Questo ha risolto il mio problema iniziale, ma mi ha portato a cercare altre caratteristiche di cui non ero a conoscenza. Per i #requires, c’è un’intera lista:

1
2
3
4
5
6

#Richiede -Version N
#Richiede -PSEdition
#Richiede -PSSnapin PSSnapin-Name ]
#Richiede -Modules { Module-Name | Hashtable }
#Requires -ShellId ShellId
#Requires -RunAsAdministrator

Come potete vedere, questi vi danno molto potere nel controllare come e quando il vostro script viene eseguito. Il #Requires –Version è utile se il tuo script richiede caratteristiche che sono disponibili solo in una versione più recente di PowerShell. Nota che questo è un numero minimo. La versione di PowerShell che stai eseguendo deve corrispondere a questo o essere superiore. Non puoi usarlo per richiedere una versione precedente di PowerShell. Per esempio, un utile cmdlet che ho usato in un recente script è compress-archive. Fortunatamente, questo script era specifico per il problema che stavo cercando di risolvere, ma se stessi cercando di scrivere uno script più generale, potrei voler mettere #requires –Version 5.0 alla fine del mio script. Per dimostrare salvate il seguente script come richiede la versione example.ps1.

1
2
3

#requires -Versione 5.0
Get-Process | Out-File -FilePath .\Process.txt
Compress-Archive -Path .\Process.txt -DestinationPath .\Process.zip -Force

Se si esegue questo all’interno della propria istanza PowerShell ISE esistente, dovrebbe funzionare senza problemi, ma se si tenta di eseguire in una versione precedente, come PowerShell 2.0, lo script darà errore sulla linea #requires e non eseguirà mai il resto dello script. Questo è il risultato desiderato.

Per testare, si potrebbe anche mettere qualcosa come –Version 99.99 e si vedranno messaggi di errore simili agli esempi qui sotto, ma ho voluto mostrare come questo funzionerebbe nel mondo reale su sistemi esistenti e anche dimostrare la capacità della linea di comando di tornare a una versione precedente di PowerShell.

Per testare questo, dovrete usare la versione da linea di comando di PowerShell e avviarla come segue:

1
C:\>Powershell -versione 2.0

Poi esegui il file che hai salvato sopra requires version example.ps1. dovresti vedere un errore come:

Mentre consiglierei di mettere il commento #Requires proprio all’inizio del file, in verità, potete metterlo ovunque e si comporterà allo stesso modo. Se ricreate il file di cui sopra ma spostate il commento in basso dopo il Get-Process e salvate come requires version esempio Version 2.ps1.

1
2
3

Get-Process | Out-File -FilePath .\Process.txt
#requires -Versione 5.0
Compress-Archive -Path .\Process.txt -DestinationPath .\Process.zip -Force

Provare ad eseguirlo sotto la versione 2.0 come sopra, e si otterrà un errore simile e l’intero script non verrà eseguito.

Questo significa che non si può avere una parte di uno script che può essere eseguito sotto una vecchia versione (o eseguito come non amministratore) e poi una parte che richiede una versione particolare o di essere eseguita come amministratore. Se volete fare qualcosa del genere nel codice, dovete diventare più intelligenti. Salvate il seguente script come Requires version example Version 3.ps1.

1
2
3
4
5
6
7
8
9

Get-Process | Out-File -FilePath .\Processo.txt
if ($PSVersionTable.PSVersion. Major -ge 5)
{
Compress-Archive -Path .\Processo.txt -DestinationPath .\Process.zip -Force
}
else
Write-Host “Mi dispiace Dave, non posso farlo”.
}

Se lo esegui sotto la versione 5 o superiore, creerà il file Process.txt e lo zipperà. Se lo si esegue sotto una versione precedente, come la –Version 2.0 sopra, lo script sarà ancora in grado di creare il file Process.txt poiché Get-Process è una cmdlet disponibile nella versione 2.0. Poiché Compress-Archive non lo è, lo script salterà quel passo e darà un messaggio di errore. Dipende da voi se volete scrivere script che possano rilevare la versione di PowerShell e comportarsi diversamente a seconda della versione, ma in molti casi se volete semplicemente interrompere lo script, il commento #Requires è di gran lunga il modo più semplice di gestire le cose.

Due ultime avvertenze sull’uso di un commento #Requires. Deve iniziare all’inizio della linea; non si possono avere spazi o tabulazioni prima di esso. Inoltre, non potete cercare di superarlo in astuzia e metterlo come parte di un blocco try/catch per gestirlo con più grazia. Salvate il seguente script per illustrare entrambi i caveat: Richiede la versione di esempio Version 4.ps1.

1
2
3
4
5
6
7
8
9
10

#richiede -Version 5.0
try
{
write-host “Siamo alla versione 5.0!”
#requires -Version 5.0
}
catch
{
write-host “Ehi, non siamo alla versione 5!”
}

Nota che è il #requires sulla linea 6 che ha interrotto lo script, non quello sulla linea 1, e il try/catch non ha avuto effetto. I #Requires sono globali e hanno un impatto sull’intero script, indipendentemente da dove sono, purché inizino sulla linea. E sì, potete avere più di un #Requires in uno script. Si potrebbe richiedere una versione specifica di PowerShell, certi moduli per essere presenti e per RunAsAdministrator.

Due avvertenze finali sul commento #Requires – RunAsAdministrator. È stato introdotto nella versione 4.0 di PowerShell e non funziona su sistemi non Windows (sì, ricordate, PowerShell è ora multipiattaforma!). Salva il seguente script come Requires Administrator.ps1.Avrai bisogno di un’istanza di Linux per testare questo, ma supponendo che tu lo faccia, PowerShell può essere installato su Linux usando i metodi spiegati qui. Una volta installato, copiate o salvate lo script di cui sopra nella vostra istanza Linux. Per eseguire lo script potete inserire:

1
Pwsh “./Requires Administrator.ps1”

Si dovrebbe vedere

Infine, ci si potrebbe chiedere se è possibile utilizzare commenti in stile blocco con il #Requires. Dai miei limitati test, questo non funziona. Hai bisogno di mettere ogni Requires sulla propria linea con un # precedente. Questo script funziona:

1
2

#Richiede -RunAsAdministrator
#Richiede -Versione 5.0

Questo script non funziona:

1
2

<#Richiede -RunAsAdministrator
Richiede -Versione 5.0 #>

Conclusione

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *