PowerShell: parliamone serenamente
Rubo il titolo ad un già citato post di Enrico, per parlare stavolta di PowerShell visto che è stata più volte citata nei commenti di questo blog.
Non sono un esperto di Command Line Interface (CLI o shell), non sono mai stato un sys-admin in vita mia, e perciò mi limiterò ad un paio di osservazioni di superficie.
Prima osservazione: le shell non dovrebbero essere intese come strumenti per l'utente finale.
Se a molti può sembrare ovvio, ad alcuni può sembrare una bestemmia. Credo che i nerd che abbiano imparato ad usare *nix nei vecchi laboratori dell'Università siano quelli che considerano la mia affermazione una bestemmia, abituati com'erano al solo accesso terminale. Nel lab di calcolo numerico dell'Università di Bari, nel 1992 circa, era l'unico modo di usare *nix: i pochi terminali "grafici" erano in grado solo di mostrare un'anteprima di plotting. Niente mouse, niente finestre, ma solo editor e shell testuali. Anche il DOS aveva una shell molto primitiva (Command.com) in grado di supportare loop e altre amenità, ma impallidiva a confronto delle possibilità offerte dalla Bash shell.
Seconda osservazione: le UI non dovrebbero essere intese come strumenti per l'amministrazione in larga scala
Il sys-admin non deve cliccare sulla check-box della UI di ogni singola macchina per fare il deploy di qualche policy. Qualcuno potrebbe pensare che un sistema come Windows basato prevalentemente su UI, avesse scarsissime capacità di shell scripting. Che il sys-admin Windows sia insomma costretto ad impossibili acrobazie grafiche. Niente di più scorretto, vista la combinazione di:
- modalità Console alias Command Prompt (erede del vecchio command.com) in grado di interpretare file batch (.BAT) e command (.CMD) di bassa complessità
- linguaggi di scripting come VBScript, disponibili in modalità Console tramite "plug-in" come Windows Scripting Host
- layer di sistema apposito, Windows Management Instrumentation (WMI), che espone le funzionalità di alcuni componenti di sistema ai vari linguaggi di scripting
- laddove non arriva WMI, occorre scrivere una applet Console nel proprio linguaggio di programmazione preferito (C/C++/Pascal/ecc.)
In parole povere, affermare che non si possa amministrare Windows via scripting in nessun modo, è perlomeno falso. Questo non vuol dire però la combinazione di cui sopra sia una soluzione ottimale o comparabile con altre shell tradizionali. Per colmare questa lacuna è stato rilasciato, il 30 Gennaio 2007, una nuova CLI chiamata appunto PowerShell. Power non per caso perché si integra completamente con il framework .Net. Inizialmente il piano era di rilasciare PowerShell integrandolo in Vista e come download separato per le altre piattaforme (XP e Win2k3), però motivi logistici hanno portato ad una soluzione diversa. Sarà però rilasciato come componente integrato, seppur opzionale, di Windows Server 2008.
Il numero di Maggio 2007 di Linux Magazine, dedica due pagine scritte con estrema chiarezza ad un confronto tra la Bash Shell e PowerShell. Riporto alcuni brani molto significativi:
New to the world of Windows is the way PowerShell regards everything as a filesystem and not only navigates the filesystem and drives, but the Registry, the certificate store, and environment variabels.
[...]
In PowerShell, all cmdlets create defined objects as their output data instead of text-only output.
[...]
Although passing data objects is slightly more complex, this object orientation helps standardize operations and supports handling of complex data structures.
For example, Bash needs and external XML parser (like Saxon or Xalan-J) to parse XML files.
[...]
Bash is useful as a plain but straightforward tool for most daily tasks. If it comes to the need for advanced uses and complex data structures, you can branch out into object-oriented Python or the graphical capabilities of Tcl/Tk.
Conclusione:
PowerShell : Bash = Bash : WinConsole+VBScript+WMI
In poche parole non solo il gap è stato colmato, ma ne è stato creato uno più grosso nella direzione opposta: basti pensare alle possibilità offerte ed integrate in PowerShell, che in Bash richiedono tool esterni. Questa dicesi innovazione, parola di Linux Magazine, Maggio 2007.
-quack
P.S. è possibile rinominare 200 file già usando gli strumenti a disposizione con il Command Prompt senza neanche scomodare i vari linguaggi di scripting.
Potrebbero interessarti anche:


Facebook,
Wikio,
Segnalo.

venerdì 1 febbraio 2008 alle 4:38 PM -
Bash è una possibile shell, non LA shell, per quanto alla fine su *nix il metodo tradizionale di veicolare informazioni, cioè via flussi testuali, sia più scomodo di quello strutturato di psh (mi consenti l'abbreviazione?). Insomma, niente awk e fesserie del genere. Infatti mi sono sempre chiesto perché non si sia adottata una sintassi standardizzata, ad esempio xml, per formattare meglio l'input e l'output così da renderlo utilizzabile per un trattamento automatico non rudimentale.
Io fino ad ora mi sono arrangiato con tcl, anche perché l'ho usato parecchio e non conosco molto la sintassi di bash. Credo che alla fine certi utilizzatori di unix non troveranno difficile dire che psh non introduce nulla di nuovo, unicamente sulla base del fatto che conoscono bene i loro strumenti e ci riescono a fare di tutto. E io in un certo senso concordo sulla base del fatto che per me non è una questione di limiti ma di ergonomia.
Una osservazione su tool esterni: è nella filosofia unix mettere assieme le funzionalità di tool esterni. Io non ci vedo nulla di male. Il giudizio secondo me è da esprimere valutando quanto sia facile mettere assieme i diversi pezzi. Il metodo unix purtroppo richiede una serie di manipolazioni che a ben vedere si potrebbero evitare. Basterebbe poco, come ho detto sopra.
Permalink - Rispondi al commento
venerdì 1 febbraio 2008 alle 4:41 PM -
Il fatto di essere una shell "ad oggetti" è di per se rivoluzionario. Almeno aviteremo di sbattere la testa con sed, awk, ecc...
Permalink - Rispondi al commento
venerdì 1 febbraio 2008 alle 4:49 PM -
@sirius
Vero.
Però io per risolvere una specifica necessità di amministrazione remota ho provato ad usare PoweShell su Windows (una workstation con su XP) ed ho notato i seguenti limiti:
- non si può usare in remoto, anche se non so se sia un limite quando la si usa in XP;
- il supporto è ancora scarso, mancando ancora tutti quegli agganci che permettano di usarla assieme a strumenti terze parti.
p.s.: applescript c'è dal 1993
Permalink - Rispondi al commento
venerdì 1 febbraio 2008 alle 9:00 PM -
Di primo acchito mi verrebe da dire: "too little, too late...".
Comunque IMHO il concetto si integra benissimo in UNIX, dove tutto è un file... Su Windows non me la vedo così bene... Mi riservo cmq di provare PowerShell alla prima occasione.
Ah, e cmq quelli che chiami "tool esterni" sono in gran parte dei programmini standard di UNIX fin dagli anni '80.
Permalink - Rispondi al commento
venerdì 1 febbraio 2008 alle 10:08 PM -
"in Unix tutto è un file..."
è sbagliato. In entrambi i casi "tutto viene percepito come un file" (meglio ancora in PowerShell come un oggetto). Per intenderci un device non è un file, ma su Unix tramite shell/API ci accedi come se lo fosse; stessa cosa anche su PowerShell, dove tutto viene esposto come "oggetto". Il fatto che questa astrazione avvenga a livello di linguaggio (PSH) e non a livello di Kernel (come in *nix) non inficia i benefici di un'unica interfaccia per il sys-admin.
Il discorso dei tool esterni non è tanto dove sono, ma quanto "integrati" sono nell'insieme. Insomma anche se il parser XML è installato di default, dal punto di vista sintattico invocarlo non sarà la stessa cosa che invocarne uno che si integra meglio. Pura speculazione, non sono né un esperto di shell, né un sys-admin.
Permalink - Rispondi al commento
sabato 2 febbraio 2008 alle 1:09 AM -
La potenzialità dell'approccio "tutto è file" sta nel fatto che con tools che svolgono operazioni semplicissime (taglia, seleziona un campo, dammi le prime tot righe) in molti casi ti risolvi la vita.
O puoi scriverti da te due righe di C, sapendo che vai a leggerti un file di testo, e senza dover consultare 200 pagine di manuale per sapere la gararchia delle classi che ti servono. E la complicazione la gestisce il kernel e tu non devi sbatterti con le classi.
Un approccio più pratico che con le classi (che sono più eleganti questo lo ammetto) non si può avere.
(giusto per darti un esempio con due-righe-due di bash si costruisce un webserver che ritorna una pagina statica, utile in caso di "emergenza". In PS si può fare?)
Per quanto riguarda i tools di UNIX sappi sono più che integrati, sono standarizzati POSIX! L'esempio di un parser XML è fuori luogo perchè in ambito server (dove la shell serve) su UNIX praticamente nessun file di configurazione è in XML.
Permalink - Rispondi al commento
sabato 2 febbraio 2008 alle 1:37 AM -
Ottime osservazioni, discordo su alcuni punti.
> senza dover consultare 200 pagine di manuale per sapere la gararchia delle classi che ti servono.
> Un approccio più pratico che con le classi (che sono più eleganti questo lo ammetto) non si può avere.
Non serve grazie alla reflection/auto-complete dei moderni editor: uno degli esempi della rivista mostrava come fare il dump di tutte le proprietà di un oggetto senza conoscerle a priori, il tutto con poche righe.
L'approccio "tutto è un file" ti spinge a conoscere i dettagli del formato di quello che ti serve e solo dopo puoi "tagliare, selezionare un campo, o prendere le prime tot righe". Pensa se vuoi fare il parsing di header JPEG e sputare una lista di punti bidimensionali che rappresentano altezza e larghezza di ogni immagine (esempio stupido ma non me ne viene in mente uno migliore). Pensa invece quanto sia semplice la vita se hai a disposizione un oggetto che ha come proprietà le informazioni fondamentali dell'header JPEG e non devi più studiarti il formato del file per farne il dump.
Quello che è interessante è capire quanto è mappato (60%? 80%? 100%?) in classe e se quello che non è mappato si può gestire come file normale. L'articolo sulla rivista era molto ambiguo, parla proprio di mappare su file anche in PowerShell. Sarebbe interessante provare.
> In PS si può fare?
Non ho provato, ma penso davvero di sì data la profondità immensa del .Net framework.
> su UNIX praticamente nessun file di configurazione è in XML.
Vero, ma non fermarti ai file di configurazione. Pensa a SOAP e alla possibilità di invocare un webservice, estrapolare i risultati, fare qualche altra magagna e sputare il risultato. È il primo esempio che mi è venuto in mente per deformazione professionale. Se ti va prova a pensare una implementazione POSIX e dimmi quanti pezzi sono più o meno necessari: io non ne ho la più pallida idea, potrebbe venire fuori un confronto interessante e disinteressato.
Permalink - Rispondi al commento
sabato 2 febbraio 2008 alle 12:24 PM -
Domanda: per aprire la propria applicazione a psh che cosa si deve fare? Cioè, cout, cin (o printf e scanf) sono pratica normale di sviluppo e bastano per integrare un'applicazione con la shell unix. Come si attua lo stesso rapporto su windows tra applicazioni e psh? Cosa deve fare lo sviluppatore? Una cosa che non ho capito è se comunque la via testuale è supportata (cioè, in mancanza d'altro...).
Permalink - Rispondi al commento
sabato 2 febbraio 2008 alle 2:07 PM -
Mi sono scaricato PowerShell... Quando ho due minuti liberi provo a giocarci un po'... (così magari discuto con più cognizione di causa)
> Pensa se vuoi fare il parsing di header JPEG e sputare una
> lista di punti bidimensionali che rappresentano altezza e
> larghezza di ogni immagine
Su Linux si può fare (se ben ricordo) con identify, dal pacchetto ImageMagick.... non tutto viene fatto a bassissimo livello...
> Se ti va prova a pensare una implementazione POSIX e dimmi quanti pezzi sono più o meno necessari
Una cosa molto quick'n'dirty si potrebbe fare con netcat, un parser XML (lo standard POSIX non ne prevede, ma ogni distribuzione Linux ne è provvista) e un po' di bash.
Certo che se dipende da cosa intendi per "qualche altra magagna"... se le operazioni da svolgere sono complesse allora è più naturale passare ad un linguaggio di scripting più evoluto, oppure a qualcosa di più specifico ancora...
---
Una delle prime cose che mi hanno fatto vedere della shell di UNIX è stato questo comando che permette di decomprimere tutti i file in una directory:
for i in . ; do unzip $i ; done
Solo per curiosità: qual è l'equivalente in PS di questo comando?
Permalink - Rispondi al commento
sabato 2 febbraio 2008 alle 4:26 PM -
<blockquote>
for i in . ; do unzip $i ; done
Solo per curiosità: qual è l'equivalente in PS di questo comando?
</blockquote>
In PS non so, ma da DOS:
for %f in (*) do unzip %f
scaricando unzip dal pacchetto di GnuWin32 o usando 7z come alternativa.
Ciao
Permalink - Rispondi al commento
domenica 3 febbraio 2008 alle 2:24 AM -
Un link che mi hanno passato oggi e che non c'entra niente... O forse si...
www.ex-parrot.com/.../upside-down-ternet.html
Il vicino ti ruba la connessione Internet? E tu specchiagli tutte le immagini... Oppure blurrale tutte!
Faccio notare lo scriptino in perl, altra shell/linguaggio di scripting di UNIX... (si potrebbe scrivere tranquillamente anche in bash cmq, in PS si può fare?)
Permalink - Rispondi al commento
domenica 3 febbraio 2008 alle 10:42 AM -
@FDG:
ci sono due modi di interagire con PSH applicativamente parlando. Scrivere un cmdlet che espone il suo output come oggetto e quindi si integra perfettamente in PSH oppure si può invocare la classica applicazione Windows e se si tratta di un'applicazione Console catturarne l'output come avviene con il classico command.exe
@zakk:
non dubito che trovare un parser XML sia un gioco da ragazzi, ma una migliore integrazione porta a script più semplici. Tra l'altro il post mette anche l'accento sulle capacità di scripting disponibili senza PSH che sono sufficienti per un loop.
Lo scherzetto delle immagini sembra fattibilissimo tramite cmdlets. Non ho fatto più di qualche prova banale, non so quanto complicato sia.
Permalink - Rispondi al commento
giovedì 7 febbraio 2008 alle 1:40 PM -
Domanda scema... un qualunque linguaggio interpretato come python o ruby o php o perl dispone spesso di un interprete a linea di comando.
Perche' nessuno usa mai la CLI di detti linguaggi come shell?
A me e' capitato di dover fare un lavoro di parsing e editing di vari files xml, con la CLI di ruby ho praticamente fatto il lavoro in tempo reale. E avevo un modello completamente a oggetti del filesystem, una sintassi pulita, guida in linea subito a lato e via dicendo...
Se anche non sono pensate per essere usate come shell ci vanno molto vicino, e un framework come quello di php o ruby potrebbe dare signori risultati anche in ambito sysadministration, basterebbe far evolvere la shell (ed il framework magari) di conseguenza.
In alternativa si puo' sempre fare come faceva un mio compagno di corso che lavorava IN MATLAB. Sul serio, faceva persino il cropping dei file mp4 in matlab!
Permalink - Rispondi al commento
venerdì 22 febbraio 2008 alle 7:14 AM -
Ho raccolto la "sfida" e sviluppato uno script PowerShell che funge da server web di emergenza in formato ridotto.
Trovate lo script qui:
www.powershell.it/.../Creare-un-mini-webserver-di-emergenza-da-script.aspx
Cheers!
--
Efran Cobisi
powershell.it
Permalink - Rispondi al commento
venerdì 22 febbraio 2008 alle 6:52 PM -
Fichissimo! Complimenti per il sito!!
Permalink - Rispondi al commento