Averiguando el tamaño de una carpeta en Windows

Hace rato vengo intercambiando e-mails con Juan Santander, quien vive en Cuba.  En uno de esos e-mails, Juan me indicaba que había enviado una sugerencia al grupo de producto de Windows sobre el tamaño de las carpetas y el argumentaba que desde Windows 95 no se ve esa información.  Como el muy bien me dijo, "Creeme, cuando uno revisa una maquina o busca algo, ese dato puede agilizar mucho el trabajo o 'iluminarnos'.

No puedo estar mas de acuerdo con él.  De hecho, en Windows Vista, como se aprecia en la siguiente gráfica, también tenemos esta situación.

image

¿Qué extraño, no?  Sobre todo porque para los archivos si sale el tamaño, pero para las carpetas o folders no, bueno excepto si pasan el mouse por encima de una carpeta, ahí si les dice el tamaño, pero para ciertos escenarios, esta funcionalidad no nos ayuda mucho.  Investiguemos un poco del por qué de esta situación...

Lo primero que se me ocurrió fue, al no obtener por ninguna manera el tamaño de un archivo, generar un script para esto.  Es decir, asumí que tal vez es un error de visualización y no un error de sistema operativo; espero que esta presunción sea la correcta, jeje.

Por supuesto, me dirigí al TechNet Script Center para ubicar un script que me permitiera realizar esto.  Fui revisando y leyendo y me encontré con varias cosas interesantes; primero, en este artículo de "Hey, Scripting Guy" encontré cómo obtener el tamaño de una carpeta pero también encontré una respuesta parcial a el por qué no sale el tamaño de la carpeta cuando una usa el Windows Explorer.  Basicamente, la propiedad que se utiliza del servicio WMI, FileSize, retorna NULL para el tamaño de una carpeta, sin importar cual sea ésta.  Sin embargo, el FileSystemObject si determina el tamaño de una carpeta.

Bueno, nada, a probar con diferentes scripts.  Pero antes, si no usas Windows Vista todavía, te recomiendo descargar y usar el Scriptomatic 2.0, ya que éste no es soportado en Windows Vista.  Además, con el Scriptomatic 2.0, puedes generar salidas en formato CSV, para que leas desde Excel e incluso en formato HTML.

Después de algunos ensayos, al mejor estilo prueba y error, terminé con esta versión:

On Error Resume Next

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

Set colSubfolders = objWMIService.ExecQuery _
("Associators of {Win32_Directory.Name='C:\My Stuff'} " _
& "Where AssocClass = Win32_Subdirectory " _
& "ResultRole = PartComponent")

For Each objFolder in colSubfolders
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolderFSO = objFSO.GetFolder(objFolder.Name)
intSize = objFolderFSO.Size/1024
intSize = Round(intSize/1024,2)
Wscript.Echo objFolder.Name & ": " & intSize
Next

Y el resultado fue:

image

Noten que hice unas simples operaciones para obtener el tamaño en MB, ya que la propiedad Size del FSO, arroja el tamaño en bytes.

Y bueno, como todo en la vida, este script es factible de mejorar, por supuesto.

Ahora lo que hace falta, es pasar este script a Windows Powershell, pero eso será tema de otro post.

Saludos.