Hey, Scripting Guy!Dove sono i supporti per i bicchieri?

Gli Scripting Guy di Microsoft

L'articolo è basato sulla versione preliminare di Windows PowerShell e le informazioni riportate sono soggette a modifiche.

Ogni volta che una nuova tecnologia irrompe sul mercato, occorre del tempo prima che le persone inizino a notare le reali differenze tra le soluzioni adottate in precedenza e la tecnologia appena nata. Si provi, ad esempio, a pensare all'avvento dell'automobile. Esiste una buona ragione per cui nei primi anni i nuovi aggeggi meccanici venivano chiamati "carrozze senza cavalli": è esattamente ciò che erano. Se si tenta di tracciare le differenze tra le prime automobili e le carrozze trainate da cavalli, a parte la diversa trazione animale o meccanica, è in effetti difficile distinguere le une dalle altre.

Oggi sarebbero, ovviamente, poche le persone a confondere un'automobile con una carrozza trainata da cavalli. Il motivo consiste nel fatto che, con il passare del tempo, i produttori di automobili hanno marcato in modo inconfondibile la separazione tra auto e carrozze. Le automobili di oggi, ad esempio, escono dalla catena di montaggio già corredate di lettore di CD, climatizzatore e sistema di navigazione satellitare. Non si ricordano carrozze a trazione animale equipaggiate allo stesso modo. Allo stesso modo, si immagini di essere alla guida di una carrozza trainata da cavalli nel 1880 e di dover appoggiare un attimo il Frappuccino; impossibile. Alcuni SUV invece sono dotati di 17 diversi supporti per tazze e bicchieri e una delle marche più popolari prevede tre supporti per bevande solo per il guidatore. In alcuni dei modelli più recenti i supporti per le bevande sono riscaldati o refrigerati.

Nota Certo oggi sembra impossibile che in passato si potesse sopravvivere senza bere tre diverse bibite durante la guida. Come si può anche solo immaginare di mettersi alla guida con solo due o, addirittura, una sola bibita a disposizione?

Perché una nuova tecnologia abbia successo, è necessario che ai consumatori siano chiari i motivi per cui è necessario preferire il prodotto nuovo e sconosciuto al vecchio e affidabile. Quando sono comparsi sul mercato, i DVD consentivano di guardare i film a casa, esattamente come i registratori di videocassette. Di contro, i DVD erano molto più costosi delle videocassette e non era nemmeno possibile utilizzare un lettore di DVD per registrare le trasmissioni televisive preferite. Inutile dire che i DVD hanno fatto molta fatica a conquistare il mercato. Prima che i DVD iniziassero a soppiantare i vecchi registratori VHS, è stato necessario che i produttori di DVD includessero nei titoli distribuiti alcune sequenze tagliate, le interviste ad attori che non si erano neanche notati nel cast e altri contenuti che non era possibile inserire in una videocassetta. La semplice possibilità di guardare un film a casa non era sufficiente e i produttori di DVD hanno dovuto fornire contenuti e funzionalità che superassero quelle già a disposizione degli utenti di VHS.

Nota Il fatto che esista o meno qualcuno che davvero guarda i contenuti extra di un DVD non è rilevante: la natura umana è fatta così e se una cosa è disponibile scatta immediato il desiderio di possederla. Per inciso, gli Scripting Guy stanno pensando da tempo di lanciare un DVD con tutto il testo eliminato dagli articoli di TechNet Magazine e dei finali alternativi per gli script di amministrazione del sistema.

Utilizzo di Windows PowerShell

Windows PowerShell™, la nuova tecnologia di shell comandi/scripting rilasciata da Microsoft, è un ulteriore esempio di nuovo prodotto sul mercato. Quando si sente parlare per la prima volta di Windows PowerShell, in genere si ascoltano affermazioni del tipo:

  • "Windows PowerShell consente di gestire processi e servizi."
  • "Windows PowerShell consente di recuperare gli eventi dai registri eventi."
  • "Windows PowerShell consente di utilizzare WMI per la gestione dei computer."

Nessuna di queste affermazioni è errata e tutte si riferiscono ad attività utili e importanti. L'unico problema è rappresentato, ovviamente, dal fatto che è già possibile eseguire tutte queste attività con VBScript e Windows Script Host. La compatibilità a ritroso è importante e Windows PowerShell non sarebbe nemmeno un'innovazione se non consentisse di eseguire almeno le stesse operazioni eseguite con VBScript (come un lettore di DVD con cui non si riesca nemmeno a guardare i film, ma non è nemmeno necessario immaginarselo un oggetto tanto inutile: uno degli Scripting Guy ne ha uno in bella mostra a casa).

D'altra parte, se con Windows PowerShell si possono eseguire le stesse operazioni già possibili con VBScript, perché mai ci si dovrebbe occupare di questa "nuova" tecnologia? In effetti VBScript viene fornito senza alcun supporto per i bicchieri, ma neanche Windows PowerShell, a dire il vero, ne ha. Qual è dunque la differenza tra le tecnologie di scripting già disponibili e appena rilasciate?

In tutta onestà si potrebbe dire che non esiste alcuna differenza. Ma è anche vero che, a parte l'assenza di supporti per i bicchieri, Windows PowerShell è dotato di funzionalità che in VBScript non sono disponibili. Se il lavoro quotidiano prevede solo la gestione di processi e servizi, i motivi per passare immediatamente alla nuova tecnologia di Windows PowerShell potrebbero non essere evidenti; non è mai consigliabile cercare di aggiustare una cosa che già funziona bene (se riferita agli Scripting Guy questa massima tende a essere interpretata come "meglio che voi ragazzi non proviate nemmeno ad aggiustare qualcosa che funziona, altrimenti finireste con il romperla"). Windows PowerShell rappresenta una novità interessante quando sussiste la possibilità di utilizzarlo per eseguire operazioni altrimenti impossibili con VBScript, come modificare, ad esempio, l'ora dell'ultima scrittura di un file.

Modifica dell'ora dell'ultima scrittura

Proprio così: modifica dell'ora dell'ultima scrittura di un file. Chi crea script ha sempre sognato, per vari motivi (ad esempio, come forma semplice e rapida di controllo delle versioni), di poter modificare l'ora dell'ultima scrittura (o l'ora di creazione) per un singolo file o una serie di file. Purtroppo questa funzionalità non esiste in WMI (Windows Management Instrumentation) o FileSystemObject, dove le date dei file sono di sola lettura.

In Windows PowerShell, invece, per modificare l'ora dell'ultima scrittura di un file e impostare data e ora correnti è sufficiente eseguire questo comando:

$a = Get-Item c:\scripts\test.txt; $a.LastWriteTime = Date

Prima di illustrare il funzionamento del comando, è opportuno rispondere alla domanda che sorge spontanea: come mai con Windows PowerShell è possibile modificare l'ora dell'ultima scrittura di un file quando con WMI non è possibile? È opportuno rispondere prima di tutto a questa domanda, perché rappresenta un equivoco molto diffuso su Windows PowerShell. Si tende erroneamente a considerare Windows PowerShell solo un nuovo modo per utilizzare WMI. È di certo vero che con Windows PowerShell è possibile accedere ai dati WMI, come è altrettanto vero che, in attesa della creazione di ulteriori cmdlet (comandi di Windows PowerShell nativi), la maggior parte degli script di amministrazione dei sistemi sarà basata soprattutto su WMI. Come impostazione di fondo, tuttavia, Windows PowerShell è basato su .NET Framework e i cmdlet di Windows PowerShell vengono di solito utilizzati con oggetti .NET piuttosto che con oggetti WMI. Questa è una differenza importante, dal momento che le proprietà disponibili in .NET Framework non sono necessariamente le stesse disponibili in WMI.

Quando, ad esempio, si utilizza il cmdlet Get-Item per eseguire l'associazione a un file, non si ottiene un'istanza della classe CIM_Datafile di WMI, ma un oggetto .NET. Un comportamento del genere è senza dubbio conveniente, poiché un oggetto .NET espone dei metodi e una serie di proprietà per la gestione dei file leggermente diversi rispetto a WMI. Come appena illustrato, questa lieve differenza è molto importante, almeno quanto la differenza che esiste tra una proprietà di sola lettura e una proprietà che può essere letta e scritta.

Affiora un'ulteriore domanda: come si fa a sapere che il cmdlet Get-Item restituisce un oggetto .NET? In questo, come in molti altri casi, il metodo migliore per scoprire di che tipo di oggetto si tratta (oltre che il modo più semplice per identificare le proprietà e i metodi disponibili) consiste nell'eseguire l'associazione a un file e passare l'oggetto al cmdlet Get-Member:

Get-Item c:\scripts\test.txt | Get-Member

I risultati del comando sono illustrati nella Figura 1. Si tratta proprio di un oggetto .NET (gli Scripting Guy non sbagliano mai).

Figure 1 Membri dell'oggetto restituito da Get-Item

   
TypeName: System.IO.FileInfo

Name                      MemberType     Definition
----                      ----------     ----------
AppendText                Method         System.IO.StreamWriter AppendText()
CopyTo                    Method         System.IO.FileInfo CopyTo(String destFileName),
                                         System.IO.FileInfo CopyTo(S...
Create                    Method         System.IO.FileStream Create()
CreateObjRef              Method         System.Runtime.Remoting.ObjRef CreateObjRef(
                                         Type requestedType)
CreateText                Method         System.IO.StreamWriter CreateText()

Con questo semplice comando si evidenziano due delle funzionalità più interessanti e utili di Windows PowerShell: pipelining e metainformazioni. In questo articolo non si analizzano i dettagli tecnici, ma l'idea di fondo che sta dietro il pipelining è la possibilità di utilizzare un cmdlet per recuperare un oggetto e passare, quindi, tale oggetto a un altro cmdlet. Nel comando si è utilizzato il cmdlet Get-Item per ottenere un oggetto che rappresenti il file C:\Scripts\Test.txt che si è passato quindi (come oggetto) tramite pipeline al cmdlet Get-Member (il simbolo | rappresenta la pipeline in un comando di Windows PowerShell).

Con Get-Member viene quindi eseguito il recupero dei metodi e delle proprietà dell'oggetto. Questa è un'altra delle funzioni ingegnose di Windows PowerShell: è molto facile accedere alle metainformazioni, ovvero alle informazioni sulle informazioni. Con l'utilizzo di cmdlet come Get-Member e Get-Command è possibile interrogare Windows PowerShell su tutto ciò che si desidera, così come è possibile scrivere uno script WMI per recuperare informazioni sul classi, proprietà e metodi WMI disponibili.

È tuttavia importante notare come con Get-Member vengano potenziate le funzionalità di WMI. Sebbene, infatti, sia possibile utilizzare WMI per ottenere informazioni su oggetti WMI, non è possibile utilizzare WMI per ottenere informazioni su altri oggetti COM (ad esempio, FileSystemObject). Windows PowerShell si comporta in modo diverso e Get-Member funziona con qualsiasi oggetto sia possibile associare o creare. Non si ricordano più i metodi disponibili quando si utilizza FileSystemObject? Ecco il comando da eseguire:

New-Object -comobject "Scripting.     FileSystemObject" | Get-Member

Una funzionalità davvero molto utile e, a oggi, decisamente sottoutilizzata.

Molto efficace. Se si scorre l'elenco di proprietà e metodi disponibili per l'utente per il file C:\Scripts\Test.txt, sarà possibile notare questa riga:

LastWriteTime             Property       System.DateTime LastWriteTime {get;set;}

Interessante. In apparenza LastWriteTime è una proprietà che supporta sia get (lettura) che set (scrittura). Significa forse che è possibile utilizzare Windows PowerShell per modificare il valore dell'ora di ultima scrittura del file? Hmmm...

Glossario di Windows PowerShell

Alias Un nome personalizzabile che rappresenta un cmdlet esistente. In Windows PowerShell sono disponibili alcuni alias predefiniti che consentono di mappare i comandi di shell più comuni rispetto ai cmdlet equivalenti.

Cmdlet L'unità di funzionalità più piccola in Windows PowerShell, analogo ai comandi incorporati di altre shell.

Comando Un'unità di esecuzione in Windows PowerShell. In un comando possono coesistere più operazioni in pipeline e più righe separate dal carattere ;.

Frappuccino Nota bevanda a base di caffè ghiacciato venduta da Starbucks.

Monad/MSH/Microsoft Command Shell Nomi in codice attribuiti in precedenza a Windows PowerShell.

Oggetto Dati strutturati recuperati dal sistema o da un comando. Windows PowerShell consente di manipolare i dati come oggetti .NET, modificando le proprietà dell'oggetto in base al nome senza che sia necessario analizzare l'output di un comando basato su testo.

Parametro Opzioni impostate su un cmdlet nella riga di comando. In Windows PowerShell si utilizza un trattino iniziale (-) per contrassegnare un parametro.

Pipeline Consente di inviare l'output di un comando all'input di un altro comando. Definita anche pipe, viene rappresentata nei comandi con il carattere |.

Profilo Impostazioni caricate all'avvio di Windows PowerShell che consentono di configurare il funzionamento della shell.

Script Uno o più comandi salvati come file ed eseguiti da un file. I file di script di Windows PowerShell sono contraddistinti dall'estensione .ps1.

Shell Un ambiente a riga di comando in cui è possibile eseguire sia comandi che cmdlet.

Variabile Un oggetto o parametro di cui è possibile impostare, modificare o recuperare il valore durante l'esecuzione di un comando.

Ora è il momento di fare un passo indietro e tornare ad analizzare il comando che consente di impostare come ora dell'ultima scrittura di Test.txt la data e ora correnti. Ecco la sintassi:

$a = Get-Item c:\scripts\test.txt; $a.LastWriteTime = Date

Come si può osservare, lo script è molto breve. All'inizio si dichiara una variabile denominata $a. Quindi si utilizza il cmdlet Get-Item per connettersi al file C:\Scripts\Test.txt. L'oggetto viene a propria volta archiviato nella variabile $a. Dopo il punto e virgola (che consente di eseguire più comandi posizionati su una singola riga), si imposta come valore della proprietà LastWriteTime la data e ora correnti. Questa funzionalità quasi compensa la mancanza di supporti per i bicchieri!

Un po' di fantasia

Le novità non si limitano, ovviamente, alla possibilità di impostare come ora dell'ultima scrittura la data e l'ora correnti. Si prenda, ad esempio, in considerazione il seguente comando:

$b = Get-Date "5/22/2006 8:15 PM";
$a = Get-Item c:\scripts\test.txt; $a.LastWriteTime = $b

Questa volta sono stati combinati tre comandi. All'inizio si è utilizzato il cmdlet Get-Date per creare un oggetto data/ora uguale a 5/22/2006, 8:15 PM. Perché non si è creato un oggetto data/ora con Get-Date anche nel primo script per impostare come ora dell'ultima scrittura la data e l'ora correnti? È facile: il comando Date consente di ottenere in modo automatico un oggetto data/ora. A titolo di verifica, è sufficiente digitare il seguente comando nella console di Windows PowerShell: Date | Get-Member.

Dopo aver creato un oggetto data/ora con data e ora desiderate, è possibile utilizzare il solito comando Get-Item per ottenere un oggetto che rappresenti il file Test.txt (un oggetto che va archiviato nella variabile $a). Si imposta, infine, la proprietà LastWriteTime in base al valore rappresentato dalla variabile $b:

$a.LastWriteTime = $b

E questo è niente. Basta dare un'occhiata a questo comando, in apparenza tanto innocuo:

$b = Get-Date "5/22/2006 8:15 PM";
Get-ChildItem c:\scripts | ForEach-Object {$_.LastWriteTime = $b}

Cosa c'è di interessante nel comando? È di un'utilità incredibile, come si vedrà di seguito. La prima parte è semplice: si crea ancora una volta un oggetto data/ora equivalente alle 8:15 PM del 5/22/2006. È bene, tuttavia, notare che nella seconda parte non si utilizza il cmdlet Get-Item, ma il comando seguente:

Get-ChildItem c:\scripts

Il vantaggio offerto dal cmdlet Get-ChildItem consiste nel fatto che, ogni volta che viene applicato a una cartella, consente di ottenere un elenco di tutti i file contenuti nella cartella. È quindi possibile recuperare l'elenco di file e passare tramite la pipeline (di nuovo il simbolo |) tutte le voci di tale elenco al cmdlet ForEach-Object.

In che modo verranno utilizzati i file da ForEach-Object? Ma è ovvio, si modificheranno i valori della proprietà LastWriteTime di tutti i file:

ForEach-Object {$_.LastWriteTime = $b}

Nota L'articolo di questo mese non vuole essere una guida per principianti a Windows PowerShell, ma è opportuno sottolineare che $_ è una variabile speciale che rappresenta la voce corrente in un ciclo For Each. È l'equivalente di objItem nel seguente ciclo VBScript:

For Each objItem in colItems
    Wscript.Echo objItem.Name
Next

Al termine dell'esecuzione del comando Windows PowerShell, tutti i file della cartella C:\Scripts riporteranno la stessa ora dell'ultima scrittura. Sarebbe proprio bello vedere come se la caverebbe una delle nuove carrozze senza cavalli con questo!

Le variazioni sul tema per il comando in questione sono infinite. Si potrebbe, ad esempio, modificare l'ora dell'ultima scrittura solo per i file .txt della cartella C:\Scripts. Niente di più facile:

$b = Get-Date "5/22/2006 8:15 PM"; Get-ChildItem c:\scripts\*.txt | ForEach-Object {$_.LastWriteTime = $b}

L'appetito vien mangiando

È tutto molto bello, ma lo scopo dell'articolo non è "vendere" a chi legge Windows PowerShell e neppure incoraggiare gli utenti a disfarsi degli script VBScript convertendoli tutti in Windows PowerShell. Se gli script già creati svolgono ancora egregiamente le operazioni richieste, non esiste alcun motivo per disfarsene. Lo stesso vale per file batch, strumenti da riga di comando, formule magiche e qualsiasi altro strumento si utilizzi per gestire i computer. Come si diceva, mai cercare di aggiustare una cosa che funziona.

La reale forza di Windows PowerShell non risiede tanto nel fatto che consente di eseguire operazioni già possibili altrimenti, quanto piuttosto nel fatto che, grazie all'accesso a .NET Framework, consente di eseguire operazioni che prima non erano possibili. La modifica dell'ora dell'ultimo accesso di un file (o di un gruppo di file) è solo un esempio. L'esistenza o meno di altri esempi dipende dalle operazioni che si desidera eseguire e sono proprio queste potenzialità che rendono Windows PowerShell un degno oggetto di attenzione.

A molti lettori questa presentazione di Windows PowerShell sembrerà strana: invece di iniziare da un esempio più semplice del tipo "Ciao a tutti", si è passati direttamente ad analizzare un comando multipart di Windows PowerShell, snocciolando nel frattempo termini come pipeline e cmdlet come se tutti ne conoscessero già per certo il significato. È stata una scelta ponderata. È chiaro che molti dei lettori non hanno ancora provato Windows PowerShell e sussisteva il timore, fondato, che una presentazione basata sul semplice recupero di un elenco di servizi su un computer non sarebbe riuscita ad attirare alcuna attenzione.

Nota La speranza è di non aver attirato troppo l'attenzione di lettori alla guida di infernali carrozze senza cavalli. Per molti creatori di script è già abbastanza difficile bere da tre bicchieri, guardare un DVD e parlare al cellulare durante la guida, senza dover anche aggiungere la "lettura di TechNet Magazine" a tutto il resto.

Suvvia, si diceva per molti, non per tutti.

Gli Scripting Guy di Microsoft lavorano per, o meglio sono dipendenti di Microsoft. Quando non sono troppo occupati a giocare/allenare/guardare partite di baseball (e in varie altre attività) gestiscono lo Script Center di TechNet. È possibile leggerli all'indirizzo www.scriptingguys.com.

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