Necesito obtener el tamaño de un directorio, recursivamente. Tengo que hacer esto todos los meses, así que quiero hacer un script PowerShell para hacerlo.Script de PowerShell para obtener un tamaño total de directorio
¿Cómo puedo hacerlo?
Necesito obtener el tamaño de un directorio, recursivamente. Tengo que hacer esto todos los meses, así que quiero hacer un script PowerShell para hacerlo.Script de PowerShell para obtener un tamaño total de directorio
¿Cómo puedo hacerlo?
intente lo siguiente
function Get-DirectorySize() {
param ([string]$root = $(resolve-path .))
gci -re $root |
?{ -not $_.PSIsContainer } |
measure-object -sum -property Length
}
En realidad, esto produce un poco de un objeto de resumen que incluirá el número de elementos. Usted puede simplemente agarrar la propiedad Suma sin embargo y que será la suma de las longitudes
$sum = (Get-DirectorySize "Some\File\Path").Sum
EDIT Por qué funciona esto?
Desglosemos por componentes de la tubería. El comando gci -re $root
obtendrá todos los elementos del directorio inicial $root
de forma recursiva y luego los insertará en la canalización. Por lo tanto, cada archivo y directorio en el $root
pasará por la segunda expresión ?{ -not $_.PSIsContainer }
. Se puede acceder a cada archivo/directorio cuando se pasa a esta expresión a través de la variable $_
. El precedente ? indica que esta es una expresión de filtro que significa que solo se guardan los valores en la tubería que cumplen esta condición. El método PSIsContainer devolverá verdadero para los directorios. Entonces, en efecto, la expresión de filtro solo conserva los valores de los archivos. El objeto de medida del cmdlet final sumará el valor de la propiedad Length en todos los valores restantes en la interconexión. Por lo tanto, se trata esencialmente de invocar Fileinfo.Length para todos los archivos del directorio actual (recursivamente) y sumar los valores.
Si está interesado en incluir el tamaño de los archivos ocultos y del sistema, entonces debe usar el parámetro -force con Get-ChildItem.
Aquí hay forma rápida de obtener el tamaño de extensiones de archivo específicas:
(gci d:\folder1 -r -force -include *.txt,*.csv | measure -sum -property Length).Sum
Gracias a los que publican aquí. Adopté el conocimiento para crear esto:
# Loops through each directory recursively in the current directory and lists its size.
# Children nodes of parents are tabbed
function getSizeOfFolders($Parent, $TabIndex) {
$Folders = (Get-ChildItem $Parent); # Get the nodes in the current directory
ForEach($Folder in $Folders) # For each of the nodes found above
{
# If the node is a directory
if ($folder.getType().name -eq "DirectoryInfo")
{
# Gets the size of the folder
$FolderSize = Get-ChildItem "$Parent\$Folder" -Recurse | Measure-Object -property length -sum -ErrorAction SilentlyContinue;
# The amount of tabbing at the start of a string
$Tab = " " * $TabIndex;
# String to write to stdout
$Tab + " " + $Folder.Name + " " + ("{0:N2}" -f ($FolderSize.Sum/1mb));
# Check that this node doesn't have children (Call this function recursively)
getSizeOfFolders $Folder.FullName ($TabIndex + 1);
}
}
}
# First call of the function (starts in the current directory)
getSizeOfFolders "." 0
Agradable. (Get-DirectorySize "Some \ File \ Path"). Sum/1mb o (Get-DirectorySize "Some \ File \ Path"). Sum/1gb para convertir a megs o gigs. – aphoria
¿Puedes explicar cómo funciona eso? –
@Gauenwolf, agregó una edición para explicación – JaredPar