2009-05-15 8 views
19

Comment puis-je obtenir une analyse du -ish à l'aide de PowerShell? J'aimerais vérifier périodiquement la taille des répertoires sur mon disque.du dans PowerShell?

Ce qui suit me donne la taille de chaque fichier dans le répertoire courant:

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

Mais ce que je veux vraiment est la taille totale de tous les fichiers du répertoire, y compris les sous-répertoires. Aussi, j'aimerais pouvoir trier par taille, en option.

+1

En l'absence de serverfault, cela aurait été une bonne question SO. Je pense qu'il appartient maintenant à SF (où j'attendrai la réponse, puisque j'aimerais la même chose). –

+1

@ John Saunders: Je pense que ce n'est pas tout à fait vrai. Pourquoi les questions de programmation shell devraient-elles être portées à serverfault? – Tomalak

+0

J'ai également voté pour fermer la question en tant que «appartient à serverfault.com, et j'ai mis en avant le commentaire de John, mais je considère maintenant encore. Si un utilisateur demande comment * programmer * un script dans shell, je l'accepterais comme une question de stackoverflow. En quoi diffère-t-il si le shell est PowerShell au lieu de Sh? –

Répondre

23

Il y a une mise en œuvre disponible à la "Exploring belles langues" blog:

"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} 
} 

(code par le propriétaire du blog: Luis Diego Fallas)

Sortie:

 
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! Je suis en admiration devant le powershell fu de Luis. selon les conventions PowerSell, le nom des fonctions ne devrait-il pas être verbe-objet? Alors ... summary-directory ou quelque chose, au lieu de répertoire-résumé? – Cheeso

+0

Demandez-lui. Je ne fais que le citer. :) Mais je pense que c'était la convention. – Tomalak

+4

ce serait quelque chose de plus comme get-directorysummary (il y a une liste standard de verbes) – Mark

17

J'ai modifié la commande dans la réponse légèrement pour trier par ordre décroissant par taille et inclure la taille en 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 

Sortie:

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 

Peut-être que ce n'est pas la méthode la plus efficace, mais il fonctionne.

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 } 
    } 
} 

La mine est un peu différente; Je grouper tous les fichiers sur directoryname, puis parcourir les totaux de construction de cette liste pour chaque répertoire (pour inclure les sous-répertoires).

Questions connexes