2009-05-15 3 views
19

Come posso ottenere un'analisi du utilizzando PowerShell? Mi piacerebbe controllare periodicamente la dimensione delle directory sul mio disco.in PowerShell?

Di seguito mi dà la dimensione di ogni file nella directory corrente:

foreach ($o in gci) 
{ 
    Write-output $o.Length 
} 

Ma quello che voglio davvero è la dimensione aggregata di tutti i file nella directory, comprese le sottodirectory. Inoltre mi piacerebbe essere in grado di ordinare per dimensione, opzionalmente.

+1

In assenza di serverfault, questa sarebbe stata una buona domanda SO. Penso che ora appartenga a SF (dove attenderò la risposta, dal momento che mi piacerebbe la stessa cosa). –

+1

@John Saunders: Penso che questo non sia completamente vero. Perché le domande di programmazione della shell dovrebbero essere eseguite su serverfault? – Tomalak

+0

Ho anche votato per chiudere la domanda come 'appartiene a serverfault.com, e ho svalutato il commento di @ John, ma ora lo sto prendendo in considerazione. Se un utente chiede come * programmare * uno script nella shell, lo accetterei come una domanda di stackoverflow. Come si differenzia se la shell è PowerShell invece di SH? –

risposta

23

C'è un'implementazione disponibile presso il blog "Exploring Belle Lingue":

"An implementation of 'du -s *' in Powershell"

function directory-summary($dir=".") { 
    get-childitem $dir | 
    % { $f = $_ ; 
     get-childitem -r $_.FullName | 
      measure-object -property length -sum | 
      select @{Name="Name";Expression={$f}},Sum} 
} 

(Codice dal proprietario del blog: Luis Diego Fallas)

uscita:

 
PS C:\Python25> directory-summary 

Name     Sum 
----     --- 
DLLs    4794012 
Doc    4160038 
include   382592 
Lib    13752327 
libs    948600 
tcl    3248808 
Tools    547784 
LICENSE.txt   13817 
NEWS.txt   88573 
python.exe   24064 
pythonw.exe   24576 
README.txt   56691 
w9xpopen.exe   4608 
+1

cool! Sono in soggezione del fu di powershell di Luis. secondo le convenzioni di PowerShell, il nome delle funzioni non dovrebbe essere verbo-oggetto? Quindi ... la directory di riepilogo o qualcosa, invece del riepilogo della directory? – Cheeso

+0

Chiediglielo. Sto solo citando lui. :) Ma penso che sia stata la convention. – Tomalak

+4

sarebbe qualcosa di più come get-directorysummary (c'è una lista standard di verbi) – Mark

17

Ho modificato il comando nella risposta un po 'per ordinare decrescente per dimensione e comprendono dimensione in MB:

gci . | 
    %{$f=$_; gci -r $_.FullName | 
    measure-object -property length -sum | 
    select @{Name="Name"; Expression={$f}}, 
      @{Name="Sum (MB)"; 
      Expression={"{0:N3}" -f ($_.sum/1MB) }}, Sum } | 
    sort Sum -desc | 
    format-table -Property Name,"Sum (MB)", Sum -autosize 

uscita:

PS C:\scripts> du 

Name         Sum (MB)  Sum 
----         --------  --- 
results        101.297 106217913 
SysinternalsSuite     56.081 58805079 
ALUC         25.473 26710018 
dir         11.812 12385690 
dir2         3.168  3322298 

Forse non è il metodo più efficiente, ma funziona.

1
function Get-DiskUsage ([string]$path=".") { 
    $groupedList = Get-ChildItem -Recurse -File $path | Group-Object directoryName | select name,@{name='length'; expression={($_.group | Measure-Object -sum length).sum } } 
    foreach ($dn in $groupedList) { 
     New-Object psobject -Property @{ directoryName=$dn.name; length=($groupedList | where { $_.name -like "$($dn.name)*" } | Measure-Object -Sum length).sum } 
    } 
} 

Il mio è un po 'diverso; Raggruppo tutti i file su directoryname, quindi passo a quella lista che costruisce i totali per ogni directory (per includere le sottodirectory).