2009-04-30 71 views

Respuesta

21

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.

+5

Agradable. (Get-DirectorySize "Some \ File \ Path"). Sum/1mb o (Get-DirectorySize "Some \ File \ Path"). Sum/1gb para convertir a megs o gigs. – aphoria

+0

¿Puedes explicar cómo funciona eso? –

+0

@Gauenwolf, agregó una edición para explicación – JaredPar

2

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.

2

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 
1

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 
Cuestiones relacionadas