Difference between revisions of "Powershell to emulate Unix df -k"
(Created page with "Reference http://binarynature.blogspot.co.uk/2010/04/powershell-version-of-df-command.html") |
|||
Line 1: | Line 1: | ||
− | Reference http://binarynature.blogspot.co.uk/2010/04/powershell-version-of-df-command.html | + | Reference http://binarynature.blogspot.co.uk/2010/04/powershell-version-of-df-command.html<br> |
+ | |||
+ | <source lang="posershell"> | ||
+ | |||
+ | function Get-DiskFree | ||
+ | { | ||
+ | [CmdletBinding()] | ||
+ | param | ||
+ | ( | ||
+ | [Parameter(Position=0, | ||
+ | ValueFromPipeline=$true, | ||
+ | ValueFromPipelineByPropertyName=$true)] | ||
+ | [Alias('hostname')] | ||
+ | [Alias('cn')] | ||
+ | [string[]]$ComputerName = $env:COMPUTERNAME, | ||
+ | |||
+ | [Parameter(Position=1, | ||
+ | Mandatory=$false)] | ||
+ | [Alias('runas')] | ||
+ | [System.Management.Automation.Credential()]$Credential = | ||
+ | [System.Management.Automation.PSCredential]::Empty, | ||
+ | |||
+ | [Parameter(Position=2)] | ||
+ | [switch]$Format | ||
+ | ) | ||
+ | |||
+ | BEGIN | ||
+ | { | ||
+ | function Format-HumanReadable | ||
+ | { | ||
+ | param ($size) | ||
+ | switch ($size) | ||
+ | { | ||
+ | {$_ -ge 1PB}{"{0:#.#'P'}" -f ($size / 1PB); break} | ||
+ | {$_ -ge 1TB}{"{0:#.#'T'}" -f ($size / 1TB); break} | ||
+ | {$_ -ge 1GB}{"{0:#.#'G'}" -f ($size / 1GB); break} | ||
+ | {$_ -ge 1MB}{"{0:#.#'M'}" -f ($size / 1MB); break} | ||
+ | {$_ -ge 1KB}{"{0:#'K'}" -f ($size / 1KB); break} | ||
+ | default {"{0}" -f ($size) + "B"} | ||
+ | } | ||
+ | } | ||
+ | |||
+ | $wmiq = 'SELECT * FROM Win32_LogicalDisk WHERE Size != Null AND DriveType >= 2' | ||
+ | } | ||
+ | |||
+ | PROCESS | ||
+ | { | ||
+ | foreach ($computer in $ComputerName) | ||
+ | { | ||
+ | try | ||
+ | { | ||
+ | if ($computer -eq $env:COMPUTERNAME) | ||
+ | { | ||
+ | $disks = Get-WmiObject -Query $wmiq ` | ||
+ | -ComputerName $computer -ErrorAction Stop | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | $disks = Get-WmiObject -Query $wmiq ` | ||
+ | -ComputerName $computer -Credential $Credential ` | ||
+ | -ErrorAction Stop | ||
+ | } | ||
+ | |||
+ | if ($Format) | ||
+ | { | ||
+ | # Create array for $disk objects and then populate | ||
+ | $diskarray = @() | ||
+ | $disks | ForEach-Object { $diskarray += $_ } | ||
+ | |||
+ | $diskarray | Select-Object @{n='Name';e={$_.SystemName}}, | ||
+ | @{n='Vol';e={$_.DeviceID}}, | ||
+ | @{n='Size';e={Format-HumanReadable $_.Size}}, | ||
+ | @{n='Used';e={Format-HumanReadable ` | ||
+ | (($_.Size)-($_.FreeSpace))}}, | ||
+ | @{n='Avail';e={Format-HumanReadable $_.FreeSpace}}, | ||
+ | @{n='Use%';e={[int](((($_.Size)-($_.FreeSpace))` | ||
+ | /($_.Size) * 100))}}, | ||
+ | @{n='FS';e={$_.FileSystem}}, | ||
+ | @{n='Type';e={$_.Description}} | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | foreach ($disk in $disks) | ||
+ | { | ||
+ | $diskprops = @{'Volume'=$disk.DeviceID; | ||
+ | 'Size'=$disk.Size; | ||
+ | 'Used'=($disk.Size - $disk.FreeSpace); | ||
+ | 'Available'=$disk.FreeSpace; | ||
+ | 'FileSystem'=$disk.FileSystem; | ||
+ | 'Type'=$disk.Description | ||
+ | 'Computer'=$disk.SystemName;} | ||
+ | |||
+ | # Create custom PS object and apply type | ||
+ | $diskobj = New-Object -TypeName PSObject ` | ||
+ | -Property $diskprops | ||
+ | $diskobj.PSObject.TypeNames.Insert(0,'BinaryNature.DiskFree') | ||
+ | |||
+ | Write-Output $diskobj | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | catch | ||
+ | { | ||
+ | # Check for common DCOM errors and display "friendly" output | ||
+ | switch ($_) | ||
+ | { | ||
+ | { $_.Exception.ErrorCode -eq 0x800706ba } ` | ||
+ | { $err = 'Unavailable (Host Offline or Firewall)'; | ||
+ | break; } | ||
+ | { $_.CategoryInfo.Reason -eq 'UnauthorizedAccessException' } ` | ||
+ | { $err = 'Access denied (Check User Permissions)'; | ||
+ | break; } | ||
+ | default { $err = $_.Exception.Message } | ||
+ | } | ||
+ | Write-Warning "$computer - $err" | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | END {} | ||
+ | } | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | </source> |
Revision as of 08:27, 14 June 2016
Reference http://binarynature.blogspot.co.uk/2010/04/powershell-version-of-df-command.html
Invalid language.
You need to specify a language like this: <source lang="html4strict">...</source>
Supported languages for syntax highlighting:
4cs, 6502acme, 6502kickass, 6502tasm, 68000devpac, abap, actionscript, actionscript3, ada, algol68, apache, applescript, apt_sources, arm, asm, asp, asymptote, autoconf, autohotkey, autoit, avisynth, awk, bascomavr, bash, basic4gl, bf, bibtex, blitzbasic, bnf, boo, c, c_loadrunner, c_mac, caddcl, cadlisp, cfdg, cfm, chaiscript, cil, clojure, cmake, cobol, coffeescript, cpp, cpp-qt, csharp, css, cuesheet, d, dcl, dcpu16, dcs, delphi, diff, div, dos, dot, e, ecmascript, eiffel, email, epc, erlang, euphoria, f1, falcon, fo, fortran, freebasic, freeswitch, fsharp, gambas, gdb, genero, genie, gettext, glsl, gml, gnuplot, go, groovy, gwbasic, haskell, haxe, hicest, hq9plus, html4strict, html5, icon, idl, ini, inno, intercal, io, j, java, java5, javascript, jquery, kixtart, klonec, klonecpp, latex, lb, ldif, lisp, llvm, locobasic, logtalk, lolcode, lotusformulas, lotusscript, lscript, lsl2, lua, m68k, magiksf, make, mapbasic, matlab, mirc, mmix, modula2, modula3, mpasm, mxml, mysql, nagios, netrexx, newlisp, nsis, oberon2, objc, objeck, ocaml, ocaml-brief, octave, oobas, oorexx, oracle11, oracle8, oxygene, oz, parasail, parigp, pascal, pcre, per, perl, perl6, pf, php, php-brief, pic16, pike, pixelbender, pli, plsql, postgresql, povray, powerbuilder, powershell, proftpd, progress, prolog, properties, providex, purebasic, pycon, pys60, python, q, qbasic, rails, rebol, reg, rexx, robots, rpmspec, rsplus, ruby, sas, scala, scheme, scilab, sdlbasic, smalltalk, smarty, spark, sparql, sql, stonescript, systemverilog, tcl, teraterm, text, thinbasic, tsql, typoscript, unicon, upc, urbi, uscript, vala, vb, vbnet, vedit, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, whois, winbatch, xbasic, xml, xorg_conf, xpp, yaml, z80, zxbasic
function Get-DiskFree { [CmdletBinding()] param ( [Parameter(Position=0, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true)] [Alias('hostname')] [Alias('cn')] [string[]]$ComputerName = $env:COMPUTERNAME, [Parameter(Position=1, Mandatory=$false)] [Alias('runas')] [System.Management.Automation.Credential()]$Credential = [System.Management.Automation.PSCredential]::Empty, [Parameter(Position=2)] [switch]$Format ) BEGIN { function Format-HumanReadable { param ($size) switch ($size) { {$_ -ge 1PB}{"{0:#.#'P'}" -f ($size / 1PB); break} {$_ -ge 1TB}{"{0:#.#'T'}" -f ($size / 1TB); break} {$_ -ge 1GB}{"{0:#.#'G'}" -f ($size / 1GB); break} {$_ -ge 1MB}{"{0:#.#'M'}" -f ($size / 1MB); break} {$_ -ge 1KB}{"{0:#'K'}" -f ($size / 1KB); break} default {"{0}" -f ($size) + "B"} } } $wmiq = 'SELECT * FROM Win32_LogicalDisk WHERE Size != Null AND DriveType >= 2' } PROCESS { foreach ($computer in $ComputerName) { try { if ($computer -eq $env:COMPUTERNAME) { $disks = Get-WmiObject -Query $wmiq ` -ComputerName $computer -ErrorAction Stop } else { $disks = Get-WmiObject -Query $wmiq ` -ComputerName $computer -Credential $Credential ` -ErrorAction Stop } if ($Format) { # Create array for $disk objects and then populate $diskarray = @() $disks | ForEach-Object { $diskarray += $_ } $diskarray | Select-Object @{n='Name';e={$_.SystemName}}, @{n='Vol';e={$_.DeviceID}}, @{n='Size';e={Format-HumanReadable $_.Size}}, @{n='Used';e={Format-HumanReadable ` (($_.Size)-($_.FreeSpace))}}, @{n='Avail';e={Format-HumanReadable $_.FreeSpace}}, @{n='Use%';e={[int](((($_.Size)-($_.FreeSpace))` /($_.Size) * 100))}}, @{n='FS';e={$_.FileSystem}}, @{n='Type';e={$_.Description}} } else { foreach ($disk in $disks) { $diskprops = @{'Volume'=$disk.DeviceID; 'Size'=$disk.Size; 'Used'=($disk.Size - $disk.FreeSpace); 'Available'=$disk.FreeSpace; 'FileSystem'=$disk.FileSystem; 'Type'=$disk.Description 'Computer'=$disk.SystemName;} # Create custom PS object and apply type $diskobj = New-Object -TypeName PSObject ` -Property $diskprops $diskobj.PSObject.TypeNames.Insert(0,'BinaryNature.DiskFree') Write-Output $diskobj } } } catch { # Check for common DCOM errors and display "friendly" output switch ($_) { { $_.Exception.ErrorCode -eq 0x800706ba } ` { $err = 'Unavailable (Host Offline or Firewall)'; break; } { $_.CategoryInfo.Reason -eq 'UnauthorizedAccessException' } ` { $err = 'Access denied (Check User Permissions)'; break; } default { $err = $_.Exception.Message } } Write-Warning "$computer - $err" } } } END {} }