Advertisement
Guest User

Get-DiskInfo.ps1

a guest
Apr 6th, 2021
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Function Get-DiskInfo {
  2.     ###Original Source: https://binarynature.blogspot.com/2010/04/powershell-version-of-df-command.html
  3.     param (
  4.         [Parameter(Position=0,ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)]
  5.         [Alias('hostname')][Alias('cn')]
  6.         [string[]]$ComputerName = $env:COMPUTERNAME,
  7.         [Parameter(Position=1)]
  8.         [Alias('runas')][System.Management.Automation.Credential()]
  9.         $Credential = [pscredential]::Empty,
  10.         [Parameter(Position=2)][switch]$Format
  11.     )
  12.     BEGIN {
  13.         Function Make-Readable {
  14.             Param ([Parameter(Mandatory=$true,HelpMessage='Size to Convert')]$size)
  15.             Switch ($size) {
  16.                 {$_ -ge 1PB}{$Readable = "{0:#.#' PB'}" -f ($size / 1PB);Break}
  17.                 {$_ -ge 1TB}{$Readable = "{0:#.#' TB'}" -f ($size / 1TB);Break}
  18.                 {$_ -ge 1GB}{$Readable = "{0:#.#' GB'}" -f ($size / 1GB);Break}
  19.                 {$_ -ge 1MB}{$Readable = "{0:#.#' MB'}" -f ($size / 1MB);Break}
  20.                 {$_ -ge 1KB}{$Readable = "{0:#' KB'}" -f ($size / 1KB);Break}
  21.                 default {$Readable = '{0}' -f ($size) + 'B'}
  22.             }
  23.             Return $Readable
  24.         }
  25.         $wmiq = 'SELECT * FROM Win32_LogicalDisk WHERE Size != Null AND DriveType >= 2'
  26.     }
  27.     PROCESS {
  28.         ForEach ($computer in $ComputerName) {
  29.             Try {
  30.                 If ($computer -eq $env:COMPUTERNAME) {
  31.                     $disks = Get-WmiObject -Query $wmiq -ComputerName $computer -ErrorAction Stop
  32.                 } Else {
  33.                     $disks = Get-WmiObject -Query $wmiq -ComputerName $computer -Credential $Credential -ErrorAction Stop
  34.                 }
  35.                 If ($Format) {
  36.                     # Create array for $disk objects and then populate
  37.                     $diskarray = @()
  38.                     $disks | ForEach-Object { $diskarray += $_ }
  39.                     $diskarray | Select-Object -Property @{n='Name';e={$_.SystemName}},
  40.                                                          @{n='Vol';e={$_.DeviceID}},
  41.                                                          VolumeName,
  42.                                                          @{n='Size';e={Make-Readable -size $_.Size}},
  43.                                                          @{n='Used';e={Make-Readable -size (($_.Size)-($_.FreeSpace))}},
  44.                                                          @{n='Avail';e={Make-Readable -size $_.FreeSpace}},
  45.                                                          @{n='Used %';e={"$([int](((($_.Size)-($_.FreeSpace))/($_.Size) * 100))) %"}},
  46.                                                          @{n='Avail %';e={"$(100 - [int](((($_.Size)-($_.FreeSpace))/($_.Size) * 100))) %"}},
  47.                                                          @{n='FS';e={$_.FileSystem}},
  48.                                                          @{n='Type';e={$_.Description}},
  49.                                                          @{n='Date';e={Get-Date}}
  50.                 } Else {
  51.                     Foreach ($disk in $disks) {
  52.                         $dPercentUsed = "$([int](((($disk.Size)-($disk.FreeSpace))/($disk.Size) * 100)))%"
  53.                         $diskprops = [ordered]@{
  54.                             'Computer'   = $disk.SystemName
  55.                             'Volume'     = $disk.DeviceID
  56.                             'VolumeName' = $disk.VolumeName
  57.                             'Size'       = $disk.Size
  58.                             'Used'       = ($disk.Size - $disk.FreeSpace)
  59.                             'Available'  = $disk.FreeSpace
  60.                             'Used %'     = $dPercentUsed
  61.                             'Avail %'    = "$([int](100 - $dPercentUsed.split('%')[0]))%"
  62.                             'FileSystem' = $disk.FileSystem
  63.                             'Type'       = $disk.Description
  64.                             'Date'       = Get-Date
  65.                         }
  66.                         # Create custom PS object and apply type
  67.                         $diskobj = New-Object -TypeName PSObject -Property $diskprops
  68.                         $diskobj.PSObject.TypeNames.Insert(0,'BinaryNature.DiskFree')
  69.                         Write-Output -InputObject $diskobj
  70.                     }
  71.                 }
  72.             } Catch {
  73.                 # Check for common DCOM errors and display "friendly" output
  74.                 Switch ($_) {
  75.                     {$_.Exception.ErrorCode -eq 0x800706ba}{$err='Unavailable (Host Offline or Firewall)';Break}
  76.                     {$_.CategoryInfo.Reason -eq 'UnauthorizedAccessException'}{$err='Access denied (Check User Permissions)';Break}
  77.                     default {$err=$_.Exception.Message}
  78.                 }
  79.                 Write-Warning -Message "$computer - $err"
  80.             }
  81.         }
  82.     }
  83.     END {}
  84. }
  85.  
  86. Get-DiskInfo -Format | Export-Csv -Path $HOME\Documents\windows_servers_storage_stats.csv -NoTypeInformation
  87.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement