(+351) 21 24 10006  ·  info@bconcepts.pt
Carnaxide, Lisboa

Cómo generar informes de uso de disco por usuario en PowerShell

João Barros 26 de October de 2026 4 min de lectura

Este tutorial muestra cómo generar un informe de uso de disco por usuario en PowerShell, útil para auditorías, limpieza de espacio o para comprender quién consume más almacenamiento. Aprenderás a identificar el propietario de carpetas, sumar tamaños recursivamente y exportar un CSV listo para análisis.

Requisitos previos

  • Windows con PowerShell 5.1 o PowerShell 7+
  • Permisos de lectura en las carpetas a analizar
  • Conocimientos básicos de comandos PowerShell y archivos CSV

Paso 1: Entender la lógica y preparar el entorno

Por qué: necesitamos listar carpetas, obtener el propietario (owner) y calcular el tamaño total de los archivos dentro de cada carpeta. Para evitar colas lentas, limitaremos la profundidad o procesaremos solo carpetas de nivel superior. Crea una carpeta donde guardarás el CSV final.

# Exemplo: definir pasta alvo e ficheiro de saída  $RootPath = 'C:\Compartilhado\Projetos'  $OutputCsv = 'C:\Relatorios\UsoPorUtilizador.csv'    # Criar pasta de output se não existir  $OutDir = Split-Path $OutputCsv  if (-not (Test-Path $OutDir)) { New-Item -Path $OutDir -ItemType Directory | Out-Null }

Paso 2: Obtener el propietario de una carpeta

Explicación: usamos Get-Acl para obtener el Owner. El Owner viene en el formato DOMAIN\User o MACHINE\User; normalizaremos solo el nombre del usuario para el agrupamiento.

# Função para obter proprietário (owner) simplificado  function Get-FolderOwner {      param([string]$Path)      try {          $acl = Get-Acl -Path $Path -ErrorAction Stop          $owner = $acl.Owner -split '\\' | Select-Object -Last 1          return $owner      } catch {          return 'UNKNOWN'      }  }

Paso 3: Calcular el tamaño de una carpeta recursivamente

Explicación: para cada carpeta sumaremos la longitud (Length) de los archivos de forma recursiva. Para rendimiento, evita demasiadas operaciones de E/S; usa -File y -ErrorAction para ignorar archivos inaccesibles.

# Função para calcular dimensão (em bytes) de uma pasta  function Get-FolderSize {      param([string]$Path)      try {          $size = Get-ChildItem -Path $Path -Recurse -File -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum          return ([int64]$size.Sum)      } catch {          return 0      }  }

Paso 4: Agrupar por propietario y generar el informe

Explicación: recorremos cada subcarpeta de RootPath (profundidad 1 es una elección común), obtenemos owner y tamaño, y luego agrupamos por owner. Finalmente, exportamos a CSV con tamaños en formato humano y en bytes.

# Lista de pastas de topo (profundidade 1)  $folders = Get-ChildItem -Path $RootPath -Directory -ErrorAction Stop    $results = foreach ($f in $folders) {      $path = $f.FullName      $owner = Get-FolderOwner -Path $path      $bytes = Get-FolderSize -Path $path      [PSCustomObject]@{          Owner = $owner          Path = $path          Bytes = $bytes          SizeMB = [math]::Round($bytes / 1MB, 2)      }  }    # Agrupar por Owner y sumar Bytes  $grouped = $results | Group-Object -Property Owner | ForEach-Object {      $totalBytes = ($_.Group | Measure-Object -Property Bytes -Sum).Sum      [PSCustomObject]@{          Owner = $_.Name          TotalBytes = [int64]$totalBytes          TotalMB = [math]::Round($totalBytes / 1MB, 2)          Folders = ($_.Group | Select-Object Path,SizeMB)      }  }    # Exportar resumen para CSV (sin la lista de carpetas detallada)  $grouped | Select-Object Owner,TotalBytes,TotalMB | Export-Csv -Path $OutputCsv -NoTypeInformation -Encoding UTF8    # Mostrar en pantalla un ejemplo resumido  $grouped | Sort-Object -Property TotalBytes -Descending | Format-Table -Property Owner,TotalMB -AutoSize

Paso 5: Manejar carpetas profundas o grandes (opciones avanzadas)

Explicación: si tienes muchas subcarpetas o archivos, puedes paralelizar o procesar por lotes. En PowerShell 7+ usa ForEach-Object -Parallel; en otras versiones usa jobs. También puedes ignorar carpetas con determinados patrones para acelerar.

# Exemplo simples com -Filter para ignorar pastas temporárias  $folders = Get-ChildItem -Path $RootPath -Directory -ErrorAction Stop | Where-Object { $_.Name -notmatch 'temp|cache|bak' }

Verificar el resultado

Abre el archivo CSV en Excel o con Import-Csv para confirmar. En pantalla deberías ver una tabla de los Owners con TotalMB. Confirma si los totales coinciden con una verificación doble en carpetas conocidas usando Get-FolderSize para una carpeta específica.

# Verificar un owner específico no PowerShell  Import-Csv -Path $OutputCsv | Where-Object { $_.Owner -eq 'joao' }    # Verificar dimensão de uma pasta manualmente  Get-FolderSize -Path 'C:\Compartilhado\Projetos\ProjetoX' | %{ $_ } # devolve bytes

Conclusión

Has generado un informe de uso de disco por usuario en PowerShell, con owner por carpeta, sumas en bytes y exportación a CSV. Siguientes pasos: añadir más columnas (fechas, número de archivos), integrar con una programación para informes periódicos o enviar el CSV por correo electrónico. Consejo: si los owners aparecen como SID o 'UNKNOWN', garantiza permisos y prueba Get-Acl manualmente.