Per varie ragioni (che non includono solamente il masochismo) voglio portare una procedurina di monitoraggio che ho scritto in Perl sotto Linux in ambiente Windows.
Volendo usare un linguaggio script nativo in ambiente Windows per evitare di installare programmi di qualsiasi tipo sulla macchina da monitorare, decido di usare la PowerShell.
Prima sorpresa: Microsoft distribuisce un (a suo dire) potente interprete di comandi e di script in cui l’esecuzione degli script è bloccata per default. Vabbè, la cosa si risolve creando (o modificando) la chiave di registro HKEY_Local_MachineSOFTWAREMicrosoftPowerShell1ShellIdsMicrosoft.PowershellExecutionPolicy
con valore Unrestricted
. Benedetta Microsoft!
Ok, gli script ora sono eseguibili.
Veniamo allo scopo del test: creare uno script che prende una variabile data e la invia ad un server tramite HTTP POST (ovvero simulando la compilazione di un form) e recuperare la risposta del server.
Svolgimento in PERL:
$ua = LWP::UserAgent->new;
$req = (POST "http://pippo", ["campo1" => "valore1", "campo2" => "valore2"]);
$risposta = $ua->request($req);
Svolgimento in PowerShell:
[Reflection.Assembly]::LoadFile('C:WINDOWSMicrosoft.NETFrameworkv2.0.50727System.Web.dll') | out-null
$postData = 'campo1=valore1&campo2=valore2'
$buffer = [text.encoding]::ascii.getbytes($postData)
[net.httpWebRequest] $req = [net.webRequest]::create('http://pippo')
$req.method = "POST"
$req.ContentType = "application/x-www-form-urlencoded"
$req.ContentLength = $buffer.length
$req.TimeOut = 5000
$reqst = $req.getRequestStream()
$reqst.write($buffer, 0, $buffer.length)
$reqst.flush()
$reqst.close()
[net.httpWebResponse] $res = $req.getResponse()
$resst = $res.getResponseStream()
$sr = new-object IO.StreamReader($resst)
$risposta = $sr.ReadToEnd()
E per fortuna che è una shell power!!!
6 responses to “Sulle differenze tra i linguaggi di programmazione”
Mi sembra che sta roba sia sempre una sorta di Basic, come tutti i linguaggi Microsoft. Del resto al Basic ci sono affezionati, dai, è la prima cosa che hanno rubato.
Ma scusa, dovrebbe esserci un perl su Windows, no? C’era persino sul vecchio MacOS pre-unix.
Il fatto di non installare programmi aggiuntivi è un requisito del test: vorrei usare risorse native per generare un output da inviare con un protocollo standard.
Gli ultimi linguaggi M$ sono tutti uguali (VB, C#…) e sembrano quasi lo stesso linguaggio solo con formalismi sintattici differenti.
Gli ultimi linguaggi M$.net *sono* tutti uguali a meno di formalismi sintattici.
Sono progettati per essere così ed, infatti, producono tutti lo stesso codice oggetto che gira nello stesso “ambiente d’esecuzione” .net, inoltre li puoi mischiare liberamente. Alla fine sono solo un espediente per semplificare la migrazione dei “vecchi” programmatori ante-.net al nuovo ambiente.
Credo che il primo interprete basic che scrissero non lo abbiano rubato da nessuno, ed era pure bellissimo, per l’epoca. E` dopo che si sono rovinati.
Luigi: se il requisito e` “non installare programmi aggiuntivi” purtroppo non e` soddisfatto, visto che di default il PowerShell non e` installato, e per farlo funzionare, a quanto dici, tocca pure taroccare il registry.
Dal codice che hai pubblicato ho pure l’impressione che si dipenda pesantemente da qualche DLL che prima o poi sara` rinominata o spostata…
Un bel wget.exe (non installato, semplicemente copiato nella stessa directory) e` probabilmente meno invasivo.
Lo so, usare un eseguibile stabile tratto da sorgenti GNU e` proprio una cosa del tipo “ti piace vincere facile”, sono capaci tutti a farlo funzionare. Ottenere la stessa cosa con roba MS e` ben piu` complicato, sicuramente da piu` soddisfazione 😉
PowerShell e’ installato da windowsUpdate e per quel che mi concerne e’ gia’ parte del sistema operativo. Che fosse gia’ li’ al momento dell’installazione o che ci sia arrivato dopo con aggiornamenti e’ del tutto irrilevante. C’e’ ed e’ integrato, il resto e’ accademia.
Idem per quel che dici in merito alla “dipendenza da qualche DLL”, nella fattispecie .NET
Per me .NET e PowerShell sono “risorse native” la cui compatibilita’ con l’ambiente e’ garantita ipso facto per essere distribuite con WindowUpdate. Mi serve usare qualcosa che c’e’ gia’.
wget non assolve il compito necessario al mio scopo, anzi aumenta la complessita’ perche’ dovrei lanciare un programma in shell. Quello che ho pubblicato e’ solo un frammento di una procedura piu’ complessa.
Lo scopo del post e’ di dimostrare quanto sia piu’ compatto uno script in Perl, non trovare una soluzione ad un problema che, a dirla tutta, ho gia’ risolto 🙂
spiegazione alla tua “prima sopresa” anche senza toccare il registo: http://technet.microsoft.com/en-us/library/ee176961.aspx