Seguro, que muchos de vosotros, en alguna ocasión habréis tenido que comprobar el tamaño que tienen cada una de las carpetas del árbol de carpetas de un servidor de ficheros.
Frecuentemente tenemos que realizar esta tarea, porque nos estamos quedando sin espacio en los discos de nuestro servidor de archivos y necesitamos hacer limpieza del árbol de carpetas, pero para facilitar el trabajo de vaciado primero tenemos que saber cuales son las carpetas que consumen más capacidad.
La manera más sencilla de poder comprobar el tamaño que tiene cada una de las carpetas que componen nuestro servidor de ficheros, es listar el árbol entero a un archivo de texto.
Frecuentemente tenemos que realizar esta tarea, porque nos estamos quedando sin espacio en los discos de nuestro servidor de archivos y necesitamos hacer limpieza del árbol de carpetas, pero para facilitar el trabajo de vaciado primero tenemos que saber cuales son las carpetas que consumen más capacidad.
La manera más sencilla de poder comprobar el tamaño que tiene cada una de las carpetas que componen nuestro servidor de ficheros, es listar el árbol entero a un archivo de texto.
Para realizar esta operación, usaremos la construcción del comando que mostramos a continuación. En él, sustituiremos la carpeta C:\DATOS\* por el nombre de nuestra carpeta del servidor de ficheros.
Terminada la ejecución, aparecerá por pantalla el listado de carpetas con sus tamaños.
Get-ChildItem -path "C:\datos\*" | Foreach {
$Files = Get-ChildItem $_.FullName -Recurse -File
$Size = '{0:N2}' -f (( $Files | Measure-Object -Property Length -Sum).Sum /1MB)
[PSCustomObject]@{Profile = $_.FullName ; TotalObjects = "$($Files.Count)" ; SizeMB = $Size}
}
Profile TotalObjects SizeMB
------- ------------ ------
"C:\datos\Carpeta Datos 01 64 4.965,21
"C:\datos\Carpeta Datos 02 9 1.036,36
"C:\datos\Carpeta Datos 03 9 1.036,36
"C:\datos\Carpeta Datos 04 8 12,36
Profile TotalObjects SizeMB
------- ------------ ------
"C:\datos\Carpeta Datos 01 64 4.965,21
"C:\datos\Carpeta Datos 02 9 1.036,36
"C:\datos\Carpeta Datos 03 9 1.036,36
"C:\datos\Carpeta Datos 04 8 12,36
Esto seria suficiente, si solo tenemos cuatro carpetas en nuestro servidor de ficheros, como ocurre en nuestro laboratorio de ejemplo. Pero como en la realidad no será así, lo mejor es listar el resultado de la ejecución anterior a un archivo de texto. Esto nos permitirá trabajar más cómodamente.
Para realizar esta operación, usaremos la construcción del comando que mostramos a continuación. En él, sustituiremos la carpeta C:\DATOS\* por el nombre de nuestra carpeta del servidor de ficheros y la ruta C:\folder-size\folder-size.csv por la ubicación donde deseamos almacenar el archivo de texto resultante de la operación.
Para realizar esta operación, usaremos la construcción del comando que mostramos a continuación. En él, sustituiremos la carpeta C:\DATOS\* por el nombre de nuestra carpeta del servidor de ficheros y la ruta C:\folder-size\folder-size.csv por la ubicación donde deseamos almacenar el archivo de texto resultante de la operación.
Get-ChildItem -path "C:\datos\*" | Foreach {
$Files = Get-ChildItem $_.FullName -Recurse -File
$Size = '{0:N2}' -f (( $Files | Measure-Object -Property Length -Sum).Sum /1MB)
[PSCustomObject]@{Profile = $_.FullName ; TotalObjects = "$($Files.Count)" ; SizeMB = $Size}
}| Export-CSV "C:\folder-size\folder-size.csv" -NoTypeInformation
Finalizada la ejecución del comando, encontraremos en la carpeta llamada folder-size de nuestro disco C:\, el archivo folder-size.csv. En su interior, tendremos nuestro listado de carpetas con sus tamaños.
Espero os sea de utilidad.
Me sirvió tu script, muchas gracias, le añadí "-recurse" a la primera línea para que me incluyese los subdirectorios, mi objetivo era sustituir a windirstat haciendolo via remota en mis equipos de la red.
ResponderEliminarAsí me quedó la primera línea
"(Get-ChildItem -path "C:\users\*" -recurse| Foreach {"
Saludos
Me alegro mucho Ángel Sánchez, Muchas gracias por compartir tu complemento. Seguro ayudará a mucha gente.
EliminarRecuerda que también tenemos un canal de Youtube al que puedes suscribirte si te interesan nuestros contenidos.
Un saludo
Puedo poner en vez de recursive que busque a x cantidad de niveles de subdirectorios?
ResponderEliminarClaro, pones -recurse -depth 2 (buscará 2 niveles)
Eliminarhola, muchas gracias por su scrip, queria haceter una consulta y es que como podria listar carpertas y subcarpertas con sus respectivos archivos, con la fecha de modificacion y su tamaño en GB.
ResponderEliminargracias por su colaboracion
Hola, quisiera preguntar algo. Como sería para que consultase en varias rutas el script y al final deje el resultado en el archivo .csv - agradezco tú respuesta.
ResponderEliminarLa forma más sencilla y rápida seria, ejecutar varias veces el script y anexar los archivos de texto resultantes, te dejo un enlace de como hacerlo:
Eliminarhttps://www.pantallazos.es/2019/04/windows-cmd-anexar-contenido-archivos-texto-copy.html
Recuerda que también tenemos un canal en YouTube dónde puedes encontrar más tutoriales de informática, un saludo.
Buen día.
ResponderEliminarRevisando el Código compartido tengo una duda ya que al momento de ejecutarlo sobre Windows Server 2008 este arroja varios errores. No sé si esto sea por el tema de versionamiento del PowerShell.
Get-ChildItem : No se encuentra ningún parámetro que coincida con el nombre del
parámetro 'File'.
En línea: 2 Carácter: 50
+ $Files = Get-ChildItem $_.FullName -Recurse -File <<<<
+ CategoryInfo : InvalidArgument: (:) [Get-ChildItem], ParameterB
indingException
+ FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Comm
ands.GetChildItemCommand
Mil Gracias que gran aporte funciona sin ningun problema es muy clar gracias me fue de muchisima utilidad
ResponderEliminarEstimado , a mi me arroja un error el parámetro -f y luego lo cambio por -filter y me arroja otro error que no conoce el parámetro llamado file$size
ResponderEliminarEsto es lo que estoy ingresando como comando y solo me aparecen errores recurrentes a lo mismo.
gracias
COMANDO:
Get-ChildItem -path "h:\e:\artes_iphsa\*" | Foreach {$Files = Get-ChildItem $_.FullName -Recurse -File$Size = '{0:N2}' -f (( $Files | Measure-Object -Property Length -Sum).Sum /1MB) [PSCustomObject]@{Profile = $_.FullName ; TotalObjects = "$($Files.Count)" ; SizeMB = $Size}}| Export-csv "h:\folderprueba.csv" -NoTypeInformation
ERRORES:
Get-ChildItem : No se encuentra ningún parámetro que coincida con el nombre del parámetro 'File$Size'.
En línea: 1 Carácter: 107
+ Get-ChildItem -path "h:\e\artes_iphsa\*" | Foreach {$Files = Get-ChildItem $_.FullName -Recurse -File$Size <<<< = '{
0:N2}' -filter (( $Files | Measure-Object -Property Length -Sum).Sum /1MB) [PSCustomObject]@{Profile = $_.FullName ; To
talObjects = "$($Files.Count)" ; SizeMB = $Size}}| Export-csv "h:\folderprueba.csv" -NoTypeInformation
+ CategoryInfo : InvalidArgument: (:) [Get-ChildItem], ParameterBindingException
+ FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand
Te sale ese resultado por que no estas dando los espacios correspondientes y PS te lo detecta como otro parámetro, tendrías que meterlo de la siguiente forma:
EliminarGet-ChildItem -path "h:\e:\artes_iphsa\*" | Foreach {
$Files = Get-ChildItem $_.FullName -Recurse -File
$Size = '{0:N2}' -f (( $Files | Measure-Object -Property Length -Sum).Sum /1MB) [PSCustomObject]@{Profile = $_.FullName ; TotalObjects = "$($Files.Count)" ; SizeMB = $Size}
}| Export-csv "h:\folderprueba.csv" -NoTypeInformation
Hola, excelente aporte, llevaba mucho buscando esto, podría indiarme como sepeude embeber esto en SQL?
ResponderEliminarHola, estoy tratando de generar esta información desde un query de SQL, pero me genera el siguiente error: Sintaxis incorrecta cerca de 'Size'.
ResponderEliminarEste es el código:
set @sql = 'powershell.exe -c "$fso = new-object -com Scripting.FileSystemObject
gci -Path "D:\*" -Directory `
| select @{l='Size'; e={$fso.GetFolder($_.FullName).Size}},FullName `
| sort Size -Descending `
| ft @{l='Size [MB]'; e={'{0:N2} ' -f ($_.Size / 1MB)}},FullName "'
Agradezco tu apoyo.
Hola, modifique el codigo para extraer solo la ruta, fecha de modificado y fecha de creacion, todo lo hacer bien pero lo coloca en la misma columna al momento de exportar en txt, en el powershell se ve bien, lo que quiero es que la ruta, fecha de creacion y fecha de modificado esten separados en columnas, dejo el codigo:
ResponderEliminarGet-childitem -Recurse | Foreach {
$Files = Get-ChildItem $_.FullName -File
[PSCustomObject]@{Ruta = $_.FullName ; FechaDeCreacion = $_.CreationTime ; FechaModificado = $_.LastWriteTime}
} | Out-File C:\Users\Rojas.Ricardo\Desktop\listado.txt