12/02/2009

Deframmentare il disco di un PC

A cura di Efran Cobisi


La deframmentazione dei dischi è un'operazione indispensabile per la corretta manutenzione di un PC; non eseguirla comporta dei rischi a lungo termine, legati soprattutto ad un abbassamento del livello di performance globali della macchina. Spesso, però, è un'attività che non viene automatizzata ma semplicemente schedulata in ogni PC oppure, ancora peggio, portata a termine manualmente ad intervalli irregolari.

Windows PowerShell, fortunatamente, ci consente di gestire in maniera agevole e completa la deframmentazione dei dischi: se pensate che il massimo grado di automazione possibile consista nel lanciare defrag.exe proseguite con la lettura, ci sono delle piacevoli sorprese per voi.

La classe WMI Win32_Volume consente di recuperare i volumi logici all'interno di una macchina; un volume logico rappresenta un'area di storage all'interno di uno o più dischi fisici e può avere una lettera distintiva di rappresentazione assegnata (come C:, D:, etc).
Tra i metodi esposti dalla classe Win32_Volume ce ne sono un paio che possiamo utilizzare per gestire la deframmentazione dei dischi: Defrag() e DefragAnalysis(). Il primo consente di avviare un'operazione di deframmentazione, restituendo successivamente l'analisi sullo stato di deframmentazione del disco. Il secondo, invece, restituisce solo quest'ultima, consentendo al chiamante di stabilire se proseguire con la deframmentazione oppure meno.

Vediamo, prima di tutto, quanto sia facile recuperare un volume (di un PC remoto, nell'esempio) tramite WMI:

$volume = gwmi Win32_Volume -ComputerName Server01 | ? { $_.DriveLetter -eq 'C:' }

Autoesplicativo, vero?

Recuperato il volume, l'analisi sullo stato di deframmentazione può essere lanciato con il comando che segue: prestate attenzione al fatto che, alla pari dei tempi della rispettiva interfaccia utente, questa operazione può impiegare anche diversi minuti, a seconda del volume da analizzare.

$defragAnalysis = $volume.DefragAnalysis()

L'oggetto ritornato consente di verificare agevolmente se la deframmentazione è consigliata dal sistema operativo (dipende dal sistema, tipicamente c'è una soglia del 10% di volume frammentato):

if ($defragAnalysis.DefragRecommended) { ... }

Nel caso di policy aziendali differenti da quelle "raccomandate", invece, l'analisi consente di recuperare il dettaglio dei valori trovati, come la percentuale di spazio frammentato, il numero di file frammentati, il numero di blocchi totali e così via.

Ecco uno script che riporta alcune di queste informazioni:

$defragAnalysis.DefragAnalysis.FilePercentFragmentation $defragAnalysis.DefragAnalysis.TotalFragmentedFiles $defragAnalysis.DefragAnalysis.LargestFreeSpaceExtent ...

Per un elenco completo delle proprietà disponibili in questo oggetto, vi rimando naturalmente alla guida di riferimento sulla classe Win32_DefragAnalysis, all'interno di MSDN.

Una volta stabilito se effettuare la deframmentazione di un disco, è possibile, naturalmente, provvedere utilizzando il metodo Defrag(). Questo metodo accetta un valore logico, che indica se forzare una deframmentazione oppure meno. Se la deframmentazione non viene forzata, il sistema stabilisce automaticamente se questa è necessaria per il volume.

Volendo forzare una deframmentazione, magari in seguito ad un'analisi sullo stato di deframmentazione appena compiuta, potremmo, quindi, utilizzare questo script:

$volume.Defrag($true)
Commenti
29/01/2010 11.00
ollecram: se non vi funziona è perchè
la classe Get-WmiObject è disponibile in xp
29/01/2010 11.02
ollecram: correggo...
volevo dire che la classe NON è disponibile in xp
29/01/2010 11.20
efran.cobisi: Disponibilità classe Win32_DefragAnalysis
@ollecram: Hai ragione, Win32_DefragAnalysis è disponibile da Windows Server 2003 in poi per i sistemi server e da Windows Vista in poi per i sistemi desktop.

Grazie per la segnalazione!
13/05/2010 9.47
FrassiDoc: Disponibilità classe Win32_DefragAnalysis
E nella nuova versione PowerShell 2.0 per XP ci sarà?
13/05/2010 10.21
efran.cobisi: Win32_DefragAnalysis su Windows XP
@FrassiDoc: No, la disponibilità non è legata a PowerShell 2.0 ma a Windows XP, che non espone questa classe WMI; sinceramente non credo che Win32_DefragAnalysis verrà mai aggiunta a Windows XP.

Ciao