mercoledì 22 febbraio 2017

TUTORIAL POWERSHELL - PARTE 4 - OBJECT ORIENTED

Tutorial introduttivo all'utilizzo di PowerShell, a prima vista una estensione del prompt dei comandi di Microsoft Windows ma che in realtà è molto di più.






Lista completa articoli su Tutorial PowerShell [link]

Introduzione

Una caratteristica fondamentale di PowerShell è che tutto è un oggetto, questa tecnologia infatti fu creata per essere Object Oriented fin dal suo concepimento. L'aspetto positivo è che non è necessario essere dei professionisti della Programmazione ad Oggetti per avere dimestichezza con PowerShell.

Nella Programmazione ad Oggetti troviamo:
  • Classi: rappresentazioni astratte di un entità, formata da degli attributi e in grado di svolgere delle funzionalità attraverso l'esecuzione di funzioni chiamate metodi.
  • Oggetti: una specifica istanza (rappresentazione concreta) di una Classe, i cui attributi acquisiscono un valore e i cui metodi possono essere eseguiti.
Abbiamo appena detto che PowerShell lavora ad oggetti, quindi tutto ciò che lo riguarda, dai cmdlet, ai parametri, all'output, è un oggetto.

Framework .Net

PowerShell è costruito sopra la piattaforma .Net (di fatto è scritto in C#) per questo motivo può interagire con tutti gli oggetti offerti dal framework proprio come viene fatto in un progetto Visual Studio comune.

Nello specifico, l'essere legato alla piattaforma .Net approfondisce leggermente quanto descritto nel paragrafo precedente. In ambiente .Net infatti vengono introdotti alcuni concetti aggiuntivi nella Pogrammazione ad Oggetti:
  • Proprietà, speciali attributi che contengono al loro interno già dei metodi per essere scritti e letti (questi metodi possono anche essere modificati)
  • Eventi, speciali tipi di dato che permettono una gestione asincrona dei metodi scatenando una esecuzione basata sul verificarsi di una determinata situazione.
In ambiente .Net: Proprietà, Metodi ed Eventi sono tutti Membri

Pipeline

Per ripeterlo ancora: ogni volta che viene eseguito un cmdlet PowerShell stiamo interagendo ad oggetti, utilizzando un oggetto, passando come parametro un oggetto e ottenendo un oggetto come risultato.

Questo significa che anche l'output dei più semplici cmdlet è un Oggetto (anche gli alias). Prendiamo ad esempio il comando DIR di DOS per mostrare il contenuto del percorso corrente:


L'output che abbiamo ricevuto dobbiamo intenderlo come un oggetto, quindi è possibile interagire con esso (attributi, proprietà e, se presenti, metodi). Supponiamo di voler estrarre solo i nomi dal comando DIR, per fare questo dobbiamo introdurre il cmdlet Select-Object e il concetto di Pipeline:
dir | select-object -property name

Il carattere pipe (|) indica a PowerShell di utilizzare l'output del secondo comando (a destra) come input del primo (a sinistra). In questo modo abbiamo dato come parametro di input al cmdlet DIR il risultato del cmdlet Select-Object per estrarre la proprietà name.


Analogamente al cmdlet Select-Object, è possibile effettuare altre tipi di operazioni in pipeline come filtrare (Where-Object) ed ordinare (Sort-Object). Vediamo alcuni esempi:

Esempio: se volessimo cercare, fra il contenuto della directory corrente, tutti i file TXT:
dir | where-object name -like *.txt

Esempio: se volessimo ordinare il risultato del cmdlet dir:
dir | sort-object name -Descending

Nota: fino a PowerShell 2.0 gli argomenti dei cmdlet di ricerca/filtro/ordinamento dovevano essere espressi tramite una forma leggermente diversa:
dir | where-object {$_.name -lile "*.txt"}

Quello che abbiamo appena visto, introduce una variaible molto importante _$ che è il riferimento all'oggetto del contesto corrente, una specie di this (Java/C#). Approfondiremo questo concetto più avanti in questo Tutorial [link].

Get-Member

Get-Member è un cmdlet che, se utilizzata in pipeline con un altro cmdlet, permette di mostrare l'elenco dei membri di un oggetto. Se applichiamo il cmdlet Get-Member al comando DIR otteniamo due output concatenati:



Questo perchè il cmdlet DIR fornisce come output sia directory (System.IO.DirectoryInfo) che file (System.IO.FileInfo); il cmdlet Get-Member snocciola entrambi le classi ed estrae i membri. Fra i membri della classe FileInfo troviamo il metodo delete() per la cancellazione di un file. Proviamo a creare un file di testo text.txt con Notepad.exe e salvarlo nella directory C:\, quindi eseguiamo il cmdlet: 
(dir text.txt).delete()

Tramite il comando dir abbiamo ottenuto l'oggetto che rappresenta il file text.txt e abbiamo potuto eseguire il metodo delete() per la sua cancellazione.

Conclusione

PowerShell è Object Oriented, questo concetto spero di averlo espresso nel modo più incisivo possibile, questa è la vera caratteristica di punta di PowerShell ed è anche il motivo per cui può essere utilizzato come linguaggio di programmazione o di integrazione con le proprie applicazioni. Nel prossimo articolo [link] inizieremo a scrivere i primi Script.

Nessun commento:

Posta un commento