InicioHazlo Tu MismoVer el espacio libre en disco de varios equipos en red

Ver el espacio libre en disco de varios equipos en red

Hazlo Tu Mismo12/7/2012

Es bien sabido que para cualquier sistema operativo el espacio libre en disco es un punto crítico de control. Quedarse con poco o ningun byte libre es sinónimo de tropezones y caídas... de ahí que los administradores de red con frecuencia deban verificar que los servidores a su cargo tengan tela suficiente para no agonizar en el peor momento.

Lo mismo aplica a quienes administran redes y deben encargarse del mantenimiento de las PC de los usuarios. Para colmo parece que cuanto más chico el rígido (o partición), mayor el deseo del usuario de bajar porquerías de internet o recolectar MP3 como para musicalizar cinco radios en simultáneo.

¿Como supervisar el espacio libre sin tener que ir máquina por máquina?
Powershell puede darnos una mano. Windows 7 lo incluye, en XP hay que instalarlo (lo sugiere como Update opcional), y en Vista no tengo idea. En las versiones server: 2008 lo tiene, en 2003 es opcional.

Voy a encarar el tema asi: primero varias opciones para hacer basicamente lo mismo. Luego voy a explicar qué cambia y cómo funciona. Si alguien quiere ejecutarlo y no sabe por donde empezar... fijese si tiene el enterno en Menu Inicio -.> Accesorios -> Windows PowerShell
Si no lo tiene, busquelo como update via Windows Update.

Luego abrir el "Powershell ISE". Se puede probar los comandos en la ventana inferior, algo asi como un "inmediato".

Variante 1
Recibe la lista de computadoras por una lista de nombres
Devuelve una bonita ventana en unidades legibles

$computers = @("pc2","server1", "fileserver", "server2"
Get-WmiObject Win32_LogicalDisk -filter "DriveType=3" -computername $computers | Select SystemName,DeviceID,VolumeName,@{Name="Size(GB)";Expression={"{0:N1}" -f($_.size/1gb)}},@{Name="FreeSpace(GB)";Expression={"{0:N1}" -f($_.freespace/1gb)}} | Out-GridView




Variante 2
Devuelve el resultado en una lista CSV (archivo separado por comas, leible con hoja de cálculo)
$computers = @("pc2","server1", "fileserver", "server2"
Get-WmiObject win32_logicaldisk -computer (Get-Content .Servers.txt) Where-Object { $_.DriveType -eq 3 } | Select SystemName,DeviceID,VolumeName,@{Name="Size(GB)";Expression={"{0:N1}" -f($_.size/1gb)}},@{Name="FreeSpace(GB)";Expression={"{0:N1}" -f($_.freespace/1gb)}} | Export-Csv C:tempMyDiskSpace.Csv


Variante 3
Nuevamente devuelve un archivo CSV.
Acepta como parametro una lista en un archivo de texto
.
El archivo tiene un nombre de computadora por renglon (solo eso, sin comillas ni nada).
Por ejemplo el archivo Servers.txt con este contenido:

server2
fileserver
pc2


Get-WmiObject win32_logicaldisk -computer (Get-Content c:tempServers.txt) | Where-Object { $_.DriveType -eq 3 } | Select SystemName,DeviceID,VolumeName,@{Name="Size(GB)";Expression={"{0:N1}" -f($_.size/1gb)}},@{Name="FreeSpace(GB)";Expression={"{0:N1}" -f($_.freespace/1gb)}} | Export-Csv C:tempMyDiskSpace.Csv

Variante 4
Acepta la lista por archivo de texto
Devuelve en pantalla los resultados (feo para mi gusto)
No formatea los valores devueltos, observar las unidades gigantes en bytes

Get-WmiObject win32_logicaldisk -computer (Get-Content c:tempServers.txt) | Where-Object { $_.DriveType -eq 3 } | Select-Object SystemName, DeviceID, VolumeName, FreeSpace, Size

Ahora entendamos un poco mejor qué es todo eso.
Las variantes permiten entender mejor qué se está haciendo en ese choclo de comando. Algo asi...

La papota es el comando "Get-WmiObject" que obtiene instancias (o sea, objetos) del Instrumental de Administracion de Windows (de esto es la sigla WMI). El objeto que estamos usando es win32_logicaldisk.

Para ver qué datos devuelve se puede ejecutar así crudo nomás:
Get-WmiObject win32_logicaldisk

Se puede indicar que el comando busque el espacio libre en varios equipos de la red. Dos variantes:
a) Preparando una variable que contenga los nombres de los equipos.
Esto hace que en lugar de un solo comando tengamos un script de dos lineas...


$computers = @("pc1","pc2", "fileserver", "notebook"


Notar que el vector comienza con arroba y tiene los valores separados por comas y encerrados en paréntesis. Ademas como son textos estan entre comillas.
Luego se usa el parámetro -computername para indicar que el vector que definimos tiene el dato:


Get-WmiObject win32_logicaldisk -computername $computers



b) Guardando los nombres de los equipos en un archivo de texto, un nombre por renglon.
Sencillamente agrego el parámetro -computer y a continuacion, como si se tratara de un llamado a funcion, entre paréntesis la lectura del archivo c:tempservers.txt


Get-WmiObject win32_logicaldisk -computer (Get-Content c:tempServers.txt)

Hay que pensar en el comando get-wmiObject win32_logicalDisk como en un SELECT de SQL. De hecho así lo manejaremos.

De los varios campos, nos quedaremos solo con algunos. Podríamos sencillamente hacer un select así (canalizando la salida al select):

Get-WmiObject win32_logicaldisk | Select-Object SystemName,DeviceID,VolumeName,FreeSpace,Size

Pero como el espacio medido en bytes no es precisamente fácil de interpretar a prima facie, se puede dar un formato que lo presente en GB, así:

Get-WmiObject win32_logicaldisk | Select SystemName,DeviceID,VolumeName,@{Name="Size(GB)";Expression={"{0:N1}" -f($_.size/1gb)}},@{Name="FreeSpace(GB)";Expression={"{0:N1}" -f($_.freespace/1gb)}}


Es un choclo y no lo voy a explicar en detalle, pero notar que el @ (arroba) precede a una expresion. Name es el nombre del campo. Expression es el valor. El signo peso con guion bajo representa el registro actual, notar que apunta al registro actual y a su propiedad (o miembro, siendo objetivos). Le da formato numerico "{0:N1}" y lo divide por 1 GB para hacerlo legible.

Si hay SELECT puede haber WHERE. El campo DriveType tiene un valor numérico que indica, ¡adivinen! el tipo de unidad.

3: disco local
4: disco de red
5: disco removible

Por eso vamos a pedir solamente el tipo 3, los discos rigidos locales.
Se puede hacer de dos maneras:

Como filtro, en la primera parte de la sentencia:

Get-WmiObject Win32_LogicalDisk -filter "DriveType=3" -computername $computers (sigue como antes)

Es sencillo, no? El campo es DriveType, el filtro es: -filter "DriveType=3"

O como un WHERE de SQL. Los SQLeros sabrán que el WHERE se resuelve antes que el SELECT. Por eso aunque no es el orden normal, aquí se pone primero el WHERE. Una canalizacion luego de la lectura del objeto indicando que el campo DriveType del registro actual tiene que ser igual a 3:


Get-WmiObject win32_logicaldisk | Where-Object { $_.DriveType -eq 3 } | (sigue el SELECT)


Para terminar podemos hacer que el resultado vaya a un archivo separado por comas (queda bonito, como planilla de calculo), agregando al final:

| Export-Csv C:tempMyDiskSpace.Csv

Notar que se canaliza la salida a un archivo (ruta completa explícita)
O tambien se puede generar una simpatica ventanita colocando esto al final:

| Out-GridView


Espero les sirva. Hay mucho más en la dimensión Powershell... ¿habrá algun otro post en el futuro?

Fuentes:
http://edwinfriesen.nl/content/?p=741
http://blogs.technet.com/b/tommos/archive/2011/12/03/enumerating-free-disk-space-on-remote-computers-with-powershell.aspx
Datos archivados del Taringa! original
3puntos
500visitas
0comentarios
Actividad nueva en Posteamelo
0puntos
3visitas
0comentarios
Dar puntos:

Dejá tu comentario

0/2000

Autor del Post

j
jairh🇦🇷
Usuario
Puntos0
Posts4
Ver perfil →
PosteameloArchivo Histórico de Taringa! (2004-2017). Preservando la inteligencia colectiva de la internet hispanohablante.

CONTACTO

18 de Septiembre 455, Casilla 52

Chillán, Región de Ñuble, Chile

Solo correo postal

© 2026 Posteamelo.com. No afiliado con Taringa! ni sus sucesores.

Contenido preservado con fines históricos y culturales.