Página principal Sobre mi Premios recibidos Links de Interés Contacto Blogs de referencia

Translate

martes, 31 de julio de 2018

Textual description of firstImageUrl

Windows powershell: Listar carpetas con su tamaño a un archivo CSV.

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.

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

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.

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.

Windows powershell: Listar carpetas con su tamaño a un archivo CSV.

14 comentarios:

  1. 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.

    Así me quedó la primera línea
    "(Get-ChildItem -path "C:\users\*" -recurse| Foreach {"

    Saludos

    ResponderEliminar
    Respuestas
    1. Me alegro mucho Ángel Sánchez, Muchas gracias por compartir tu complemento. Seguro ayudará a mucha gente.

      Recuerda que también tenemos un canal de Youtube al que puedes suscribirte si te interesan nuestros contenidos.

      Un saludo

      Eliminar
  2. Puedo poner en vez de recursive que busque a x cantidad de niveles de subdirectorios?

    ResponderEliminar
  3. hola, 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.

    gracias por su colaboracion

    ResponderEliminar
  4. 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.

    ResponderEliminar
    Respuestas
    1. La 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:

      https://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.

      Eliminar
  5. Buen día.
    Revisando 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

    ResponderEliminar
  6. Mil Gracias que gran aporte funciona sin ningun problema es muy clar gracias me fue de muchisima utilidad

    ResponderEliminar
  7. Estimado , 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

    Esto 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

    ResponderEliminar
    Respuestas
    1. 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:

      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

      Eliminar
  8. Hola, excelente aporte, llevaba mucho buscando esto, podría indiarme como sepeude embeber esto en SQL?

    ResponderEliminar
  9. Hola, estoy tratando de generar esta información desde un query de SQL, pero me genera el siguiente error: Sintaxis incorrecta cerca de 'Size'.

    Este 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.

    ResponderEliminar
  10. 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:

    Get-childitem -Recurse | Foreach {
    $Files = Get-ChildItem $_.FullName -File
    [PSCustomObject]@{Ruta = $_.FullName ; FechaDeCreacion = $_.CreationTime ; FechaModificado = $_.LastWriteTime}
    } | Out-File C:\Users\Rojas.Ricardo\Desktop\listado.txt

    ResponderEliminar