Windows PowershellPotenza delle variabili

Don Jones

Se si utilizza un linguaggio di scripting basato su Windows, come VBScript o KiXtart, si è già fatta l'abitudine a variabili che rappresentano solo una specie di meccanismo di archiviazione dei dati. Anche in Windows PowerShell sono disponibili delle variabili, ma sono molto più potenti delle variabili dei linguaggi di script precedenti. Le variabili di Windows

PowerShell sono associate alle classi sottostanti in Microsoft® .NET Framework. All'interno del framework le variabili sono degli oggetti, ovvero contengono dei dati che possono essere manipolati in vari modi. In effetti, proprio le notevoli capacità delle variabili di Windows PowerShell™ sono il motivo per cui il linguaggio di scripting di Windows PowerShell non prevede funzioni intrinseche di manipolazione dei dati. Queste funzioni non sono necessarie, dal momento che le variabili già assolvono ai medesimi compiti.

Dichiarazione delle variabili

Sebbene il cmdlet New-Variable in Windows PowerShell consenta di dichiarare una variabile e di assegnarle un valore iniziale, non è necessario utilizzare il cmdlet. Per creare una nuova variabile in modo immediato, è sufficiente assegnarle un valore:

$var = "Hello"

In Windows PowerShell i nomi di variabile iniziano sempre con un simbolo di dollaro ($) e possono contenere una combinazione di lettere, numeri , simboli o addirittura spazi (anche se quando si utilizzano degli spazi, è necessario racchiudere la variabile tra parentesi, in questo modo ${Variabile} = "Ciao"). Nell'esempio viene creata una nuova variabile denominata $var a cui viene assegnato il valore iniziale "Hello". Poiché in questo caso il valore è una stringa di caratteri, Windows PowerShell utilizzerà il tipo di dati String per memorizzare il valore. In termini di .NET Framework, si tratta della classe System.String, che forse dispone della funzionalità più integrata di qualunque altro tipo di variabile. Se, ad esempio, si desidera visualizzare una versione tutta in minuscolo del valore in $var, è possibile utilizzare il codice:

PS C:\> $var.ToLower()
hello
PS C:\>

Il metodo ToLower è incorporato nella classe System.String e produce una rappresentazione tutta in minuscolo del valore della stringa, senza tuttavia modificare il contenuto effettivo della variabile $var. Per visualizzare un elenco completo di tutte le operazioni che è possibile eseguire con la classe System.String, passare una variabile di tipo stringa al cmdlet Get-Member, come la seguente:

$var | get-member

Nella Figura 1 è illustrato l'output, con un paio di dozzine di metodi da utilizzare per la manipolazione delle stringhe. Quasi tutte le funzionalità garantite dalla funzione di manipolazione delle stringhe di VBScript, in Windows PowerShell vengono fornite tramite i metodi della variabile di stringa.

Figura 1 Output della classe System.String

Figura 1** Output della classe System.String **(Fare clic sull'immagine per ingrandirla)

In un contesto di amministrazione molte delle funzionalità delle variabili di tipo stringa sono più utili delle funzioni di stringa di un linguaggio come VBScript. Si supponga di aver creato uno script che consenta di leggere i percorsi UNC (Universal Naming Convention) da un file e di eseguire una determinata azione su tali percorsi. Si desidera quindi verificare, prima di tentare di utilizzare il percorso, se il percorso letto è effettivamente di tipo UNC. Il metodo StartsWith consente di ottenere la conferma che un valore di stringa inizia con i caratteri di barra rovesciata necessari per un percorso UNC:

PS C:\> $path = "\\Server\Share"
PS C:\> $path.StartsWith("\\")
True
PS C:\>

Poiché il metodo StartsWith restituisce un valore True o False, è possibile utilizzarlo nei costrutti logici:

if ($path.StartsWith("\\")) {
 # code goes here
}

In Windows PowerShell è inoltre disponibile una forma di completamento automatico per i metodi delle variabili, che consente di ridurre la quantità di testo da digitare. Se $var contiene una stringa, è possibile digitare

$var. 

e premere Tab, per visualizzare il primo nome di metodo per la variabile $var. Se si preme di nuovo Tab, si passerà al metodo successivo, mentre se si preme Maiusc+Tab si tornerà al metodo precedente. In questo modo è possibile passare da un metodo disponibile all'altro, fino a individuare il metodo desiderato.

Confusione variabile

Fino a ora gli esempi proposti hanno consentito a Windows PowerShell di determinare il tipo di dati delle variabili. L'assegnazione di una stringa a una variabile forza essenzialmente la definizione di una variabile di classe System.String. L'assegnazione di un numero a una variabile, d'altra parte, in genere comporta la creazione di una variabile di tipo Integer (più propriamente, Int32 in cui è possibile memorizzare un intervallo di valori specifico). Ad esempio:

PS C:\> $int = 5
PS C:\> $int | get-member

  TypeName: System.Int32

In questo output troncato si nota come Windows PowerShell tratti $int come un Int32, che il proprio set di metodi e proprietà. Infatti, i metodi e le proprietà disponibili sono molto meno di quelli del tipo stringa.

La variabile $int viene definita come Int32 perché il valore non è compreso tra virgolette e perché il valore è costituito da soli numeri. Quando viene inserita tra virgolette, la variabile viene interpretata come una System.String.

Se si delega a Windows PowerShell la decisione del tipo di dati di utilizzare, non si otterrà sempre il risultato desiderato. Si supponga di dover leggere da un file dei valori che si desidera trattare come stringhe. Alcuni dei valori, tuttavia, potrebbero contenere solo cifre, facendo aumentare le possibilità che Windows PowerShell consideri la variabile come Int32 o di altro tipo numerico. Questo comportamento può causare problemi per gli script. Se Windows PowerShell non riconosce il valore come una stringa, non saranno disponibili tutti i metodi della classe System.String (e il funzionamento dello script potrebbe essere basato proprio su uno dei metodi non disponibili).

Come soluzione alternativa, è possibile forzare Windows PowerShell a trattare una variabile come di un certo tipo dichiarando il tipo al primo utilizzo della variabile. Ecco un esempio:

[string]$var = 5

In genere $var sarebbe stata una variabile di tipo Int32, ma qui si è forzato Windows PowerShell in modo che interpreti $var come una stringa, garantendo la disponibilità di tutti i metodi associati alla classe System.String. La dichiarazione del tipo di variabile è anche un pratico metodo di autodocumentazione del codice, poiché ora è ovvio il tipo di dati destinati alla variabile $var. Può risultare utile dichiarare sempre un tipo specifico per tutte le variabili, sottraendo completamente la decisione a Windows PowerShell. In tal modo si rende più prevedibile il comportamento degli script e, in alcuni casi, si evitano lunghe sessioni di debug.

Come prevedibile, la dichiarazione forzata delle variabili ha delle ripercussioni, ma non necessariamente negative. Nell'esempio seguente non si dichiara il tipo della variabile:

PS C:\> $me = 5
PS C:\> $me = "Don"

La variabile $me era inizialmente di tipo Int32, ma Windows PowerShell l'ha modificata in una variabile di tipo stringa all'aggiunta del valore "Don". Windows PowerShell può modificare il tipo di una variabile in base alle esigenze, purché la variabile non è stato già stata impostata esplicitamente come di un tipo specifico.

In questo esempio si è forzato $me come variabile di tipo Int32 utilizzando il nome tipo [int]:

PS C:\> [int]$me = 5
PS C:\> $me = "Don"
Cannot convert value "Don" to type 
"System.Int32". Error: "Input string 
was not in a correct format."
At line:1 char:4
+ $me <<<< = "Don"

Quando si è quindi tentato di assegnare alla variabile un valore di stringa, è stato visualizzato un messaggio di errore. Poiché la variabile $me è stata esplicitamente forzata come variabile Int32, Windows PowerShell ha tentato di convertire la stringa "Don" in un valore di numero intero. L'operazione era impossibile, né era possibile modificare il tipo di $me in variabile di stringa.

Di tutti i tipi

In Windows PowerShell sono disponibili molti tipi di variabile. È possibile utilizzare qualsiasi tipo .NET Framework (e i tipi disponibili sono centinaia). Tuttavia, in Windows PowerShell i tipi più comuni di dati sono accessibili tramite scelte rapide. Nella Figura 2 è riportato un elenco parziale, con 10 delle scelte rapide del tipo comunemente utilizzate. Per un elenco completo, consultare la documentazione di Windows PowerShell.

Figure 2 Scelte rapide comuni per i tipi

Scelta rapida Tipo di dati
[datetime] Data oppure ora
[string] Stringa di caratteri
[char] Carattere singolo
[double] Numero a doppia precisione a virgola mobile
[single] Numero a precisione singola a virgola mobile
[int] Numero intero a 32 bit
[wmi] Istanza o insieme WMI (Windows Management Instrumentation)
[adsi] Oggetto dei servizi di Active Directory
[wmiclass] Classe WMI
[Boolean] Valore True o False

È possibile dichiarare il tipo della variabile anche utilizzando il nome completo della classe .NET Framework, come segue:

[System.Int32]$int = 5

Questa tecnica consente di utilizzare i tipi che sono in .NET Framework, ma per i quali non sono disponibili scelte rapide specifiche in Windows PowerShell.

Estensione dei tipi

Forse l'aspetto più interessante di Windows PowerShell è la possibilità di estendere le funzionalità dei tipi di variabili. Nella cartella di installazione di Windows PowerShell (in genere %systemroot\system32\windowspowershell\v1.0, ma nei sistemi a 64 bit il percorso è leggermente diverso), è presente il file types.ps1xml. È possibile modificare il file in Blocco note o in un editor XML, come PrimalScript. Per impostazione predefinita, la classe System.String non è riportata, sebbene lo siano molti altri tipi. Tuttavia, è possibile aggiungere una nuova funzionalità al tipo System.String modificando il file types.ps1xml.

Dopo la modifica, è necessario chiudere e riavviare Windows PowerShell. È inoltre necessario verificare che i criteri di esecuzione locali degli script consentano l'esecuzione di script non firmati, poiché types.ps1xml non è firmato:

Set-executionpolicy remotesigned

Dopo il riavvio di Windows PowerShell, sarà possibile utilizzare la nuova funzionalità come segue:

PS C:\> [string]$comp = "localhost"
PS C:\> $comp.canping
True
PS C:\>

Come è possibile notare, si è aggiunta una proprietà CanPing alla classe System.String. Viene restituito un valore True o False a indicare se il computer locale è in grado di eseguire il ping dell'indirizzo contenuto nella stringa. Nella Figura 3 si noterà che la query WMI utilizza una variabile speciale, $this. La variabile $this rappresenta il valore corrente contenuto nella stringa ed è il modo in cui il contenuto della variabile di stringa viene passato nella query WMI.

Figure 3 Estensione del tipo System.String

<Type>
  <Name>System.String</Name>
  <Members>
    <ScriptProperty>
      <Name>CanPing</Name>
      <GetScriptBlock>
      $wmi = get-wmiobject -query "SELECT *
FROM Win32_PingStatus WHERE Address = '$this'"
      if ($wmi.StatusCode -eq 0) {
        $true
      } else {
        $false
      }
      </GetScriptBlock>
    </ScriptProperty>
  </Members>
</Type>

Variabili al lavoro

In Windows PowerShell sono disponibili tipi di variabili flessibili e ricchi di funzionalità e un sistema altrettanto flessibile per l'estensione delle funzionalità dei tipi. Tali funzionalità ampliano in modo sorprendente le potenzialità degli script. Le variabili possono di fatto diventare la base di complessi script, superando in molti casi le funzionalità avanzate di solito disponibili in funzioni più complesse.

Ulteriori informazioni in linea

Per ottenere ulteriori informazioni sulle funzionalità di scripting di Windows PowerShell, è possibile ascoltare le trasmissioni webcast messe a disposizione degli utenti ogni secondo martedì del mese. Per iscriversi, visitare il sito Microsoft.com/events/series/donjonesscripting.mspx (in inglese).

20 febbraio 2007, Windows PowerShell: The Scripting Crash Course

Questa trasmissione webcast è un corso intensivo su variabili, costrutti, script e le funzioni di Windows PowerShell. Il corso dura un'ora e consente di toccare con mano quanto il semplice ma efficace linguaggio di scripting di Windows PowerShell renda più rapida l'automazione dell'amministrazoine di Windows®. Si esaminano inoltre i diversi strumenti di terze parti che rendono la creazione di script in Windows PowerShell ancora più indolore.

20 marzo 2007, Windows PowerShell: Functions, Filters, and Efficiency

Per imparare a creare del codice efficace e modulare in funzioni e filtri di Windows PowerShell. Durante la trasmissione si analizzano le robuste regole di ambito in Windows PowerShell che consentono di incapsulare completamente le funzioni e i filtri e si spiega come riutilizzare facilmente funzioni e filtri in progetti diversi. Si dimostra infine come sia possibile aggiungere le proprie funzioni personalizzate all'ambito globale in Windows PowerShell, in modo da facilitare la creazione di una raccolta di funzioni di utilità sempre a portata di mano.

17 aprile 2007, Windows PowerShell e WMI

Windows PowerShell può sfruttare tutta la potenza e le funzionalità di WMI. Durante la trasmissione si illustra non solo come utilizzare Windows PowerShell per accedere a WMI, ma anche come passare oggetti e insiemi di WMI tramite la pipeline di Windows PowerShell. Si descrive inoltre l'utilizzo di proprietà e metodi di WMI negli script di Windows PowerShell e si illustrano le funzionalità di protezione e configurazione sottostanti di WMI.

22 maggio 2007, Windows PowerShell: Converting from VBScript

Si desidera convertire gli script, o anche solo le proprie competenze, da VBScript a Windows PowerShell? In questa trasmissione webcast si spiega come si fa. Si illustra come in Windows PowerShell siano compresi tutti i costrutti e le funzionalità principali di VBScript e quanto sia semplice tradurre le proprie competenze di VBScript in questo nuovo ambiente di amministrazione. Viene inoltre descritta la conversione degli strumenti di VBScript nel linguaggio di scripting nativo di Windows PowerShell. Si esamina infine l'originale struttura di Windows PowerShell e si mostra come iniziare a utilizzare il linguaggio di scripting di Windows PowerShell nel modo più efficace ed efficiente possibile.

19 giugno 2007, Windows PowerShell: Under-the-Hood Extensions

In questa trasmissione webcast si scopre come Windows PowerShell utilizzi la potenza e flessibilità di .NET Framework per gestire i dati, mettendo a disposizione degli utenti centinaia di funzioni incorporate per la gestione di stringhe, date e altri tipi di dati. La novità di Windows PowerShell è la possibilità di estendere queste funzioni utilizzando gli script e nella trasmissione si illustra come creare variabili di stringhe che non solo contengano un nome di computer, ma consentano anche di ottenere informazioni sullo stato di funzionamento del computer. La trasmissione inoltre si propone di insegnare agli utenti come si creano variabili di data e ora in grado di formattare automaticamente i propri dati, senza utilizzare funzioni esterne. Ascoltare l'intera sessione per scoprire come creare in pochi minuti tutti i nuovi tipi di funzionalità in Windows PowerShell, rendendo l'amministrazione di Windows più rapida e semplice.

Don Jones è il Responsabile progetti e servizi di SAPIEN Technologies e coautore di Windows PowerShell: TFM (SAPIEN Press). È possibile contattare Don all'indirizzo www.ScriptingAnswers.com (in inglese).

© 2008 Microsoft Corporation e CMP Media, LLC. Tutti i diritti riservati. È vietata la riproduzione completa o parziale senza autorizzazione.