Powershell–Query Disk Space

Today’s post is the advertisement of a simple script, which uses Powershell and WMI to query the disks and their usage of some machine(s). Furthermore, the script allows you to query a comma-separated list of hosts by name, set a usage treshold and some html file used to display the results.

For example, the following output (html file) was obtained by querying my own machine:

Capture

As mentioned, the script itself uses simple Powershell techniques like WMI, html and csv handling. Beware that actual script comments and output is in German. Invoking the script is a simple matter, since default arguments are provided.

    1: #param:
    2: #    machineName     - einzelner Rechnername, oder kommaseparierte List von Rechnern => X oder X,Y
    3: #    usageTreshold    - Wert zwischen 0 und 1, Schwellwert für Auslastung des Festplattenspeichers in %
    4: #    htmlFile        - HTML Datei, die zur Dokumentation eingesetzt werden kann
    5:  
    6: param(
    7:     [string]$machineName = "NONE",
    8:     [float]$usageTreshold = 0.11,
    9:     [string]$htmlFile = "C:\environment.html"
   10: );
   11:  
   12: function CheckParam(){
   13:     if ([System.String]::IsNullOrEmpty($machineName) -eq $true) { throw "Rechnername darf nicht null oder leer sein!" ; }
   14: }
   15:  
   16: function GetSpaceOnMachine([string]$machine, [ref]$HTMLRepository) {
   17:     write-host "WMI - GetSpace on `"$machine`" ... " -foregroundcolor gray; 
   18:     $private:message = "";
   19:     $private:MBFrac = 0.00000095367431640625 ; 
   20:     
   21:     (get-wmiobject win32_logicaldisk -namespace "root\cimv2" -computername "$machine" ) | ? { $_.DriveType -eq 3 ; } | % {
   22:     
   23:         $private:name = $_.Name;
   24:         $private:size = $_.Size;
   25:         $private:unused = $_.FreeSpace;
   26:         $private:sizeMB = [System.Math]::Round($size * $MBFrac);
   27:         $private:unusedMB = [System.Math]::Round($unused * $MBFrac);
   28:          
   29:         $private:usage = [double]$unused / [double]$size ;
   30:         $private:usagePercent = [System.Math]::Round($usage * 100.0);
   31:         if ($usage -lt $usageTreshold) {
   32:             $message = "Festplatte $name auf $machine ... weniger als $usagePercent% frei ($unusedMB MB von $sizeMB MB frei) !" ; 
   33:             write-host $message -foregroundcolor red ;
   34:         }
   35:         else {
   36:             $message = "Festplatte $name auf $machine ... mehr als $usagePercent% frei ($unusedMB MB von $sizeMB MB frei) !" ;
   37:             write-host $message -foregroundcolor green ; 
   38:         }
   39:         
   40:         $HTMLRepository.Value.Add( ($machine + " (" + $name + ")" ), $message);
   41:     }    
   42: }
   43:  
   44: function Main(){
   45:     cls ;
   46:     
   47:     CheckParam ;
   48:     
   49:     if ( ($machineName.ToUpperInvariant() -eq 'NONE') -eq $true) {
   50:         write-host "Rechnername `"NONE`" wird auf hostname gesetzt ... "; 
   51:         
   52:         $machineName = hostname ;
   53:     }
   54:     
   55:     [hashtable]$private:HTMLRepository = @{};
   56:     
   57:     if ( $machineName.Contains(",") -eq $true ) {
   58:         write-host "Collection von Rechnern wird abgefragt ... " -foregroundcolor white ;
   59:         
   60:         ([System.Text.RegularExpressions.Regex]::Split($machineName, ",") ) | % {
   61:             GetSpaceOnMachine $_ ([ref]$HTMLRepository);
   62:         }
   63:     }
   64:     else {    GetSpaceOnMachine $machineName ([ref]$HTMLRepository) ;  }
   65:     
   66:     if ( [System.String]::IsNullOrEmpty($htmlFile) -eq $false ) {
   67:     
   68:         if ( (test-path $htmlFile) -eq $true ) { del $htmlFile -force ; }
   69:     
   70:         write-host "Exportiere Ergebnis in HTML Datei ... " ; 
   71:         add-content ("`"Rechner (Festplatte)`", `"Status (" + [System.DateTime]::Now + ")`"") -path "C:\temp.csv" ; 
   72:         $HTMLRepository.Keys  | % { 
   73:             $private:val = $HTMLRepository[$_];
   74:             $private:key = $_ ; 
   75:             add-content "`"$key`", `"$val`" " -path "C:\temp.csv" ; 
   76:         }
   77:         import-csv "C:\temp.csv" | convertto-html -title ("Freier Festplattenplatz in Umgebung (" + [System.DateTime]::Now + ")" )  > $htmlFile ;
   78:         
   79:         $x = (get-content $htmlFile)
   80:         del -force $htmlFile ;
   81:         $x | % { $_ -replace "</head>", "<style type=`"text/css`"> td { text-align:left; border:1px solid #000; vertical-align:top; overflow:hidden; } th { background-color: black; color: white; text-align:left; } table { width:100%; }</style></head>" } | add-content $htmlFile ;
   82:     
   83:         
   84:         del "C:\temp.csv" ;
   85:     }
   86: }
   87:  
   88: Main ;

Comments

  • Anonymous
    August 10, 2011
    Where is the original source?  Who is the author?  Where is the link to his site?
  • Anonymous
    August 10, 2011
    Why use inlined constants such as $private:MBFrac = 0.00000095367431640625 ;  when PowerShell provides these constants already:$private:sizeMB = [System.Math]::Round($size / 1MB);PS C:> 1KB1024PS C:> 1MB1048576PS C:> 1GB1073741824PS C:> 1PB1125899906842624PS C:>
  • Anonymous
    August 12, 2011
    @karl:I made the source, and put it (omitting my name as the author) in this blog post. I don't see a reason for putting a link to this exact same page, into the article. Maybe you take the word "advertisement" too literal.@PhilThanks! I did not think about them (inlined constants) when I typed the script, but I will surely integrate your hint.