I stumbled on the Get-SupportedFileSystems cmdlet today. Its part of the Storage module and is defined as a function. Digging a bit further its from a CDXML module based on a CIM class. But which CDXML file contains the definition?
PS> Get-ChildItem -Path 'C:\Windows\System32\WindowsPowerShell\v1.0\Modules\Storage' -File | Select-String -Pattern 'Get-SupportedFileSystems' -SimpleMatch
C:\Windows\System32\WindowsPowerShell\v1.0\Modules\Storage\Storage.psd1:117: 'Get-SupportedFileSystems',
C:\Windows\System32\WindowsPowerShell\v1.0\Modules\Storage\Volume.cdxml:405: // Get-SupportedFileSystems
Looking in Volume.cdxml shows we’re working with the ROOT/Microsoft/Windows/Storage/MSFT_Volume class. You can use this directly
PS> Get-CimInstance -Namespace ROOT/Microsoft/Windows/Storage -ClassName MSFT_Volume | select DriveLetter, FileSystem
DriveLetter FileSystem
----------- ----------
D
NTFS
NTFS
C NTFS
When you use Get-SupportedFileSystems all you get back is the filesystem
PS> Get-SupportedFileSystems -DriveLetter C
NTFS
The DriveLetter parameter can take an array of chars but if you supply a driveletter where there isn’t a defined filesystem you get an error
PS> Get-SupportedFileSystems -DriveLetter D
Get-SupportedFileSystems : Failed
Activity ID: {25bde807-4d9f-4216-8640-94268ff80624}
At line:1 char:1
+ Get-SupportedFileSystems -DriveLetter D
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (StorageWMI:ROOT/Microsoft/...age/MSFT_Volume) [Get-SupportedFileSystems],
CimException
+ FullyQualifiedErrorId : StorageWMI 4,Get-SupportedFileSystems
or if the drive isn’t defined
PS> Get-SupportedFileSystems -DriveLetter E
Get-SupportedFileSystems : No MSFT_Volume objects found with property 'DriveLetter' equal to 'E'. Verify the value of the property and retry.
At line:1 char:1
+ Get-SupportedFileSystems -DriveLetter E
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (E:Char) [Get-SupportedFileSystems], CimJobException
+ FullyQualifiedErrorId : CmdletizationQuery_NotFound_DriveLetter,Get-SupportedFileSystems
The DriveLetter parameter accepts pipeline input by propertyname BUT it has to be a Char not a string.
What would be useful would be to get the drives using Get-PSDrive and pass to Get-SupportedFileSystems
PS> Get-PSDrive -PSProvider FileSystem | Format-Table -AutoSize
Name Used (GB) Free (GB) Provider Root CurrentLocation
---- --------- --------- -------- ---- ---------------
C 202.61 273.55 FileSystem C:\ Scripts
D FileSystem D:\
Get-PSDrive outputs the driveletter as the name property and just make life fun its a string.
Time for some PowerShell magic.
This looks good
Get-PSDrive -PSProvider FileSystem |
select @{N='DriveLetter'; E={[char]$_.Name}} |
Get-SupportedFileSystems
but it fails because D doesn’t have a filesystem defined.
So try this
Get-PSDrive -PSProvider FileSystem |
foreach {
$props = [ordered]@{
DriveLetter = $_.Name
FileSystem = Get-SupportedFileSystems -DriveLetter $_.Name -ErrorAction SilentlyContinue
}
New-Object -TypeName PSObject -Property $props
}
DriveLetter FileSystem
----------- ----------
C NTFS
D
A simple way to check the filesystem used on your Windows machines