[PL] Wielkość foldera – wyzwanie dla Powershella


Okay,

Ostatnio miałem ciekawą rozmowę ze swoimi raczej unixowymi znajomymi adminami, na której słodko wyszły ich skryptowe przyzwyczajenia i niezdolność do efektywnej pracy przez okienkowe narzędzia.

Niezdolność oczywiście nie wynikającą z ich technicznej niekompetencji, tylko preferencji do włączenia terminala i wio!

Nie wiem czy ta niedawna rozmowa mnie zainspirowała czy też po prostu mam dzisiaj taki wariacki dzień, że gdy kolega w biurze zapytał mnie ile zajmuje instalka Dynamics CRM 4.0 RC0 na moim dysku to postanowiłem mu dać dokładną odpowiedź w postaci sumy z wszystkich folderów z plikami oraz osobno wielkość folderów z instalacją samego serwera, klienta, managera migracji danych itd.

Niby mam Windows, niby mogłem sobie kliknąć właściwości foldera i sprawdzić całość o tak:

image

a następnie w ten sam sposób zawartość każdego głównego podkatalogu i mam dane, które chciałem. Przy podfolderach mógłbym jeszcze potestować cierpliwość i zamiast klikać w te właściwości, mógłbym przytrzymać chwilkę myszkę nad każdym folderem i dostanę strosowną informację:

image

No ale to wszystko strasznie, toporne, nudne, skaczę pomiędzy okienkami i zanim te informacje zbiorę i wyślę komunikatorem to zetrę w proch ALT+TAB i dopiero będę miał kłopot.

Pomyślałem sobie - Ha! Dobry pretekst, żeby sobie przypomnieć składnię Power-shella'a i zrobię sobie szybki skrypcik, który mi te informacje wydobędzie. No i napisałem. Niezbyt ładny, niezbyt składny, zajęło mi to bagatela 1h (głównie z braku wiedzy w palcach, ale tak czy siak ach ta produktywność ;D). Coby zakończyć ten wpis jakimś abstrakcyjnym finiszem oto skrypt:

## get-itemsize command
##
## Description: calculates folder size including subfolders
## Version: 1.1
##
## Changelog:
##
##  ver 1.1 - fixed error with level 2 and beyond nested subfolders
##
## #########################################################
## (c) 2007 Daniel Biesiada
## Any comments or questions
## Browse:
## http://www.dbiesiada.com | http://blogs.msdn.com/danieb/
##  .. to find my contact data
## #########################################################

function get-foldersize($base_folder) {

    $foldersize = 0 
    $core_dir_content = ls $base_folder

    if ($core_dir_content.GetType().BaseType.ToString() -eq "System.Array") { 

        $itemscount = $core_dir_content.length 
        for ($counter=0; $counter -le $itemscount-1; $counter++) {

            $fullpath = [string]$base_folder
            if ($fullpath.endswith("\") -eq $false) { $fullpath +="\" }
            $fullpath += [string] $core_dir_content[$counter]

            $obj = get-item $fullpath

            if ($obj.GetType().ToString() -eq "System.IO.FileInfo") {       
                $foldersize+=$obj.Length
            }

            if ($obj.GetType().ToString() -eq "System.IO.DirectoryInfo") {                       
                $foldersize+=get-foldersize($fullpath)
            }

        } 
    } else { 
        $foldersize = $core_dir_content.length
    } 
    return $foldersize
}
##################
$base = ".\"

if ($args.count -eq 1) {
    $base = $args[0]
}

$base = resolve-path $base
write-host "Calculating size of folder:" $base

$size = get-foldersize($base)
if ($size -le 1023) { 
    write-host "Size = " $size " Bytes"
} elseif ($size -le 1024*1024-1) { 
    write-host "Size = " ($size/1024).ToString("0.00") "KBytes"
} elseif ($size -le 1024*1024*1024-1) { 
    write-host "Size = " ($size/(1024*1024)).ToString("0.00") "MBytes"
}

Przykładowy Wynik:

PS G:\Install\Dynamics\CRM 4.0> get-itemsize
Calculating size of folder: G:\Install\Dynamics\CRM 4.0
Size =  135,63 MBytes
PS G:\Install\Dynamics\CRM 4.0> get-itemsize 'Microsoft Dynamics CRM 4 0 RC0 Data Migration Manager'
Calculating size of folder: G:\Install\Dynamics\CRM 4.0\Microsoft Dynamics CRM 4 0 RC0 Data Migration Manager
Size =  21,89 MBytes
PS G:\Install\Dynamics\CRM 4.0>

Oczywiście powyższy skrypt w 100% nie załatwia tego co chciałem osiągnąć (Suma całości jest, ale nie ma sum mniejszych głównych podkatalogów od bieżącego. Mogę to rozwiązać tak jak wyżej, klikając parę skryptów pod rząd (znowu toporne), lub wykorzystać ten skrypt jako podstawę do bardziej zaawansowanej sparametryzowanej wersji. To już myślę, że jest kosmetyka 🙂 Tak czy siak chwilkę na to poświęciłem, zabawy miałem co nie miara - wciąż pytanie czy kiedy warto pisać skrypt a kiedy warto poświęcić 5 minut na wykonanie prawdziwej czynności. W przypadku znaczników wydajności w monitorze wolę jednak wizualne narzędzie niż zabawy z skryptami z poleceniami pokroju dtrace. Od razu jednak przyznaje, że żaden ze mnie profil admina 🙂

Technorati Tagi: ,,
Comments (5)

  1. wrzaskd says:

    #!/bin/sh

    find . -type d -print0 | xargs -0 du -sh

  2. Tomek says:

    Znaczy skrypt ładny, ale ja w systemie zawsze mam port kilku fajnych narzedzi i wzasadzie to wystarczy:

    c:>du.exe "G:InstallDynamicsCRM 4.0"

  3. Parę wpisów niżej przekazałem wam efekt swojej prawie 2 godzinnej pracy poznawczej nad Powershellem .

  4. Parę wpisów niżej przekazałem wam efekt swojej prawie 2 godzinnej pracy poznawczej nad Powershellem

Skip to main content