Public/Disk/Get-Disk.ps1


<#
.SYNOPSIS
Similar to Get-Disk, but includes the MediaType
 
.DESCRIPTION
Similar to Get-Disk, but includes the MediaType
 
.PARAMETER Number
Specifies the disk number for which to get the associated Disk object
Alias = Disk, DiskNumber
 
.PARAMETER BootFromDisk
Returns Disk results based BootFromDisk property
PS> Get-Disk.osd -BootFromDisk:$true
PS> Get-Disk.osd -BootFromDisk:$false
 
.PARAMETER IsBoot
Returns Disk results based IsBoot property
PS> Get-Disk.osd -IsBoot:$true
PS> Get-Disk.osd -IsBoot:$false
 
.PARAMETER IsReadOnly
Returns Disk results based IsReadOnly property
PS> Get-Disk.osd -IsReadOnly:$true
PS> Get-Disk.osd -IsReadOnly:$false
 
.PARAMETER IsSystem
Returns Disk results based IsSystem property
PS> Get-Disk.osd -IsSystem:$true
PS> Get-Disk.osd -IsSystem:$false
 
.PARAMETER BusType
Returns Disk results in BusType values
Values = '1394','ATA','ATAPI','Fibre Channel','File Backed Virtual','iSCSI','MMC','MAX','Microsoft Reserved','NVMe','RAID','SAS','SATA','SCSI','SD','SSA','Storage Spaces','USB','Virtual'
PS> Get-Disk.osd -BusType NVMe
PS> Get-Disk.osd -BusType NVMe,SAS
 
.PARAMETER BusTypeNot
Returns Disk results notin BusType values
Values = '1394','ATA','ATAPI','Fibre Channel','File Backed Virtual','iSCSI','MMC','MAX','Microsoft Reserved','NVMe','RAID','SAS','SATA','SCSI','SD','SSA','Storage Spaces','USB','Virtual'
PS> Get-Disk.osd -BusTypeNot USB
PS> Get-Disk.osd -BusTypeNot USB,Virtual
 
.PARAMETER MediaType
Returns Disk results in MediaType values
Values = 'SSD','HDD','SCM','Unspecified'
PS> Get-Disk.osd -MediaType SSD
 
.PARAMETER MediaTypeNot
Returns Disk results notin MediaType values
Values = 'SSD','HDD','SCM','Unspecified'
PS> Get-Disk.osd -MediaTypeNot HDD
 
.PARAMETER PartitionStyle
Returns Disk results in PartitionStyle values
Values = 'GPT','MBR','RAW'
PS> Get-Disk.osd -PartitionStyle GPT
 
.PARAMETER PartitionStyleNot
Returns Disk results notin PartitionStyle values
Values = 'GPT','MBR','RAW'
PS> Get-Disk.osd -PartitionStyleNot RAW
 
.LINK
https://osd.osdeploy.com/module/functions/disk/get-disk
 
.NOTES
21.3.9 Removed Offline Drives
21.3.5 Added more BusTypes
21.2.19 Complete redesign
19.10.10 Created by David Segura @SeguraOSD
#>

function Get-Disk.osd {
    [CmdletBinding()]
    param (
        [Alias('Disk','DiskNumber')]
        [uint32]$Number,

        [bool]$BootFromDisk,
        [bool]$IsBoot,
        [bool]$IsReadOnly,
        [bool]$IsSystem,

        [ValidateSet('1394','ATA','ATAPI','Fibre Channel','File Backed Virtual','iSCSI','MMC','MAX','Microsoft Reserved','NVMe','RAID','SAS','SATA','SCSI','SD','SSA','Storage Spaces','USB','Virtual')]
        [string[]]$BusType,
        [ValidateSet('1394','ATA','ATAPI','Fibre Channel','File Backed Virtual','iSCSI','MMC','MAX','Microsoft Reserved','NVMe','RAID','SAS','SATA','SCSI','SD','SSA','Storage Spaces','USB','Virtual')]
        [string[]]$BusTypeNot,
        
        [ValidateSet('SSD','HDD','SCM','Unspecified')]
        [string[]]$MediaType,
        [ValidateSet('SSD','HDD','SCM','Unspecified')]
        [string[]]$MediaTypeNot,

        [ValidateSet('GPT','MBR','RAW')]
        [string[]]$PartitionStyle,
        [ValidateSet('GPT','MBR','RAW')]
        [string[]]$PartitionStyleNot
    )
    #=======================================================================
    # PSBoundParameters
    #=======================================================================
    $IsConfirmPresent   = $PSBoundParameters.ContainsKey('Confirm')
    $IsForcePresent     = $PSBoundParameters.ContainsKey('Force')
    $IsVerbosePresent   = $PSBoundParameters.ContainsKey('Verbose')
    #=======================================================================
    # Get Variables
    #=======================================================================
    $GetDisk = Get-Disk | Sort-Object DiskNumber | Select-Object -Property *
    $GetPhysicalDisk = Get-PhysicalDisk | Sort-Object DeviceId
    #=======================================================================
    # Add Property MediaType
    #=======================================================================
    foreach ($Disk in $GetDisk) {
        foreach ($PhysicalDisk in $GetPhysicalDisk | Where-Object {$_.DeviceId -eq $Disk.Number}) {
            $Disk | Add-Member -NotePropertyName 'MediaType' -NotePropertyValue $PhysicalDisk.MediaType
        }
    }
    #=======================================================================
    # Exclude Empty Disks or Card Readers
    #=======================================================================
    $GetDisk = $GetDisk | Where-Object {$_.IsOffline -eq $false}
    $GetDisk = $GetDisk | Where-Object {$_.OperationalStatus -ne 'No Media'}
    #=======================================================================
    # -Number
    #=======================================================================
    if ($PSBoundParameters.ContainsKey('Number')) {
        $GetDisk = $GetDisk | Where-Object {$_.DiskNumber -eq $Number}
    }
    #=======================================================================
    # Filters
    #=======================================================================
    if ($PSBoundParameters.ContainsKey('BootFromDisk')) {$GetDisk = $GetDisk | Where-Object {$_.BootFromDisk -eq $BootFromDisk}}
    if ($PSBoundParameters.ContainsKey('IsBoot')) {$GetDisk = $GetDisk | Where-Object {$_.IsBoot -eq $IsBoot}}
    if ($PSBoundParameters.ContainsKey('IsReadOnly')) {$GetDisk = $GetDisk | Where-Object {$_.IsReadOnly -eq $IsReadOnly}}
    if ($PSBoundParameters.ContainsKey('IsSystem')) {$GetDisk = $GetDisk | Where-Object {$_.IsSystem -eq $IsSystem}}

    if ($BusType)               {$GetDisk = $GetDisk | Where-Object {$_.BusType -in $BusType}}
    if ($BusTypeNot)            {$GetDisk = $GetDisk | Where-Object {$_.BusType -notin $BusTypeNot}}
    if ($MediaType)             {$GetDisk = $GetDisk | Where-Object {$_.MediaType -in $MediaType}}
    if ($MediaTypeNot)          {$GetDisk = $GetDisk | Where-Object {$_.MediaType -notin $MediaTypeNot}}
    if ($PartitionStyle)        {$GetDisk = $GetDisk | Where-Object {$_.PartitionStyle -in $PartitionStyle}}
    if ($PartitionStyleNot)     {$GetDisk = $GetDisk | Where-Object {$_.PartitionStyle -notin $PartitionStyleNot}}
    #=======================================================================
    # Return
    #=======================================================================
    Return $GetDisk
    #=======================================================================
}
<#
.SYNOPSIS
Get-Disk with Fixed Disk results
 
.DESCRIPTION
Get-Disk with Fixed Disk results
 
.LINK
https://osd.osdeploy.com/module/functions
#>

function Get-Disk.fixed {
    [CmdletBinding()]
    param ()
    #=======================================================================
    # Get-Disk.osd
    #=======================================================================
    $GetDisk = Get-Disk.osd -BusTypeNot 'File Backed Virtual',MAX,'Microsoft Reserved',USB,Virtual
    #=======================================================================
    # Return
    #=======================================================================
    Return $GetDisk
    #=======================================================================
}
<#
.SYNOPSIS
Get-Disk with USB Disk results
 
.DESCRIPTION
Get-Disk with USB Disk results
 
.LINK
https://osd.osdeploy.com/module/functions
#>

function Get-Disk.usb {
    [CmdletBinding()]
    param ()
    #=======================================================================
    # Get-Disk.osd
    #=======================================================================
    $GetDisk = Get-Disk.osd -BusType USB
    #=======================================================================
    # Return
    #=======================================================================
    Return $GetDisk
    #=======================================================================
}
function Get-Disk.storage {
    [CmdletBinding()]
    param ()
    #=======================================================================
    # Get-Partition Information
    #=======================================================================
    $GetPartition = Get-Partition | `
    Where-Object {$_.DriveLetter -gt 0} | `
    Where-Object {$_.IsOffline -eq $false} | `
    Where-Object {$_.IsReadOnly -ne $true} | `
    Where-Object {$_.Size -gt 10000000000} | `
    Sort-Object -Property DriveLetter | `
    Select-Object -Property DriveLetter, DiskNumber
    #=======================================================================
    # Get-Volume Information
    #=======================================================================
    $GetVolume = $(Get-Volume | `
    Sort-Object -Property DriveLetter | `
    Select-Object -Property DriveLetter,FileSystem,OperationalStatus,DriveType,FileSystemLabel,Size,SizeRemaining)
    #=======================================================================
    # Create Object
    #=======================================================================
    $LocalResults = foreach ($Item in $GetPartition) {
        $GetVolumeProperties = $GetVolume | Where-Object {$_.DriveLetter -eq $Item.DriveLetter}
        $ObjectProperties = @{
            
            DiskNumber          = $Item.DiskNumber
            DriveLetter         = $GetVolumeProperties.DriveLetter
            FileSystem          = $GetVolumeProperties.FileSystem
            OperationalStatus   = $GetVolumeProperties.OperationalStatus
            DriveType           = $GetVolumeProperties.DriveType
            FileSystemLabel     = $GetVolumeProperties.FileSystemLabel
            Size                = $GetVolumeProperties.Size
            SizeRemaining       = $GetVolumeProperties.SizeRemaining

        }
        New-Object -TypeName PSObject -Property $ObjectProperties
    }
    #=======================================================================
    # Get-DriveInfo
    #=======================================================================
    $GetNetworkDrives = [System.IO.DriveInfo]::getdrives() | Where-Object {$_.DriveType -eq 'Network'} | Where-Object {$_.DriveFormat -eq 'NTFS'}
    $NetworkResults = foreach ($Item in $GetNetworkDrives) {
        $ObjectProperties = @{
            DiskNumber          = 99
            DriveLetter         = ($Item.Name).substring(0,1)
            FileSystem          = 'NTFS'
            OperationalStatus   = $Item.IsReady
            DriveType           = 'Network'
            FileSystemLabel     = $Item.VolumeLabel
            Size                = $Item.TotalSize
            SizeRemaining       = $Item.TotalFreeSpace

        }
        New-Object -TypeName PSObject -Property $ObjectProperties
    }
    #=======================================================================
    # Return Results
    #=======================================================================
    $LocalResults = $LocalResults | Sort-Object -Property DriveLetter
    $LocalResults = $LocalResults | Where-Object {$_.FileSystem -eq 'NTFS'}
    [array]$Results = [array]$LocalResults + [array]$NetworkResults
    Return [array]$Results
}