martedì 1 aprile 2014

Controllare l'uso della RAM da script MS-DOS

Cercando dio migliorare questo progetto mi sono imbattuto in una nuova possibilità.
Il comando wmic di Windows.
Al solito Wikipedia ci aiuto con la spiegazione del comando, e anche Microsoft non è da meno .

Dal mio punto di vista ho utilizzato questo comando per trovare il valore della RAM visibile al sistema operativo:
wmic os get freephysicalmemory /format:CSV
Ed il valore della RAM disponibile:
wmic os get totalvisiblememorysize /format:CSV
Poi andandoci a lavorare all'interno di un classico script mi sono trovato la percentuale di RAM disponibile:


for /f "skip=2 tokens=2 delims=," %%A in ('wmic os get freephysicalmemory /format:"%WINDIR%\System32\wbem\en-us\csv"') do set FREERAM=%%A

for /f "skip=2 tokens=2 delims=," %%A in ('wmic os get totalvisiblememorysize /format:"%WINDIR%\System32\wbem\en-us\csv"') do set TOTRAM=%%A

set /A PERCFREERAM=%FREERAM%/(%TOTRAM%/100)
Ho incontrato qualche problema sul formato dell'output del comando e sulla proporzione.


Nel formato di output ho scelto CSV per avere l'outoput diviso da virgola e per poterlo poi lavorare comodamente nel ciclo FOR, se non avessi messo lo switch format mi avrebbe dato il risultato in formato tabellare, lasciando una riga vuota in coda che mi dava qualche problema, in formato test, invece mi metteva come separatore uguale (=) che dava fastidio come delims del comando FOR.
Trovato il formato che mi piace in alcuni server ricevevo l'errore
"invalid xsl format"
Dopo essermi impazzito un pochino ho scoperto era legato ad un bug di Windows, in realtà qual CSV si riferisce ad un file chiamato csv.xsl che si può trovare in c:\windows\system32 o in una sua sottodirectory.
La soluzione, nel caso si ha questo errore è quella di cercarsi il file e poi referenziarlo direttamente nello switch /format: senza usarne l'estensione, un esempio è disponibile nel mio ciclo for.


Il secondo problema lo ho trovato nella proporzione con cui mi calcolo il valore percentuale della ram disponibile, A scuola mi avevano insegnato facendo:
(FRERAM*100)/TOTRAM
Su un sistema con "troppa" RAM mi tornava un risultato sballato, dopo diverse ore di impazizmanto ho scoperto che FREERAM*100 creava un valore superiore ai 32 bit ( 2^32 ), il comando SET /A me lo troncava dandomi un risultato sbagliato.
Cambiando l'ordine dell'operazione (ringrazierò sempre la mia professoressa di matematica delle superiori) come da esempio ho rimpiccolito il mio numero e sono riuscito a fare l'operazione.