Domanda

Come posso ottenere un du analisi -ish utilizzando PowerShell? Mi piacerebbe verificare periodicamente la dimensione delle cartelle sul mio disco.

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 risolvere la questione in base alle dimensioni, opzionalmente.

È stato utile?

Soluzione

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

"L'attuazione del '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)

Output:

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

Altri suggerimenti

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

Output:

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.

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; I gruppo tutti i file sul NomeDirectory, poi a piedi attraverso quella totali costruzione della lista per ogni directory (per includere le sottodirectory).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top