The essentials
Quick reference
One focused task per row. Jump to the related section for complete, working examples.
| Use | Syntax | Examples |
|---|---|---|
| List non-primordial pools | Get-StoragePool -IsPrimordial $false |
Sort-Object FriendlyName | View examples |
| Inventory physical disks | Get-PhysicalDisk |
Select-Object FriendlyName, UniqueId, SerialNumber, MediaType, CanPool, HealthStatus, OperationalStatus, Size | View examples |
| Map disks in a pool | Get-StoragePool -FriendlyName 'AppPool' |
Get-PhysicalDisk | View examples |
| List pool-eligible disks | Get-PhysicalDisk -CanPool $true |
Sort-Object Size, UniqueId | View examples |
| Inspect storage subsystem | Get-StorageSubSystem |
Select-Object FriendlyName, UniqueId, HealthStatus, OperationalStatus | View examples |
| Inspect resiliency settings | Get-StoragePool -FriendlyName 'AppPool' |
Get-ResiliencySetting | View examples |
| Preview pool creation | New-StoragePool -FriendlyName 'AppPool' `
-StorageSubsystemFriendlyName 'Windows Storage*' `
-PhysicalDisks $disks -WhatIf | View examples |
| Preview mirrored virtual disk | New-VirtualDisk -StoragePoolFriendlyName 'AppPool' `
-FriendlyName 'AppData' -ResiliencySettingName Mirror `
-Size 500GB -WhatIf | View examples |
| List virtual disks | Get-VirtualDisk |
Select-Object FriendlyName, UniqueId, ResiliencySettingName, ProvisioningType, HealthStatus, OperationalStatus, Size | View examples |
| Inspect storage footprint | Get-VirtualDisk -FriendlyName 'AppData' |
Get-PhysicalDisk | View examples |
| Map space to volumes | Get-VirtualDisk -FriendlyName 'AppData' |
Get-Disk |
Get-Partition |
Get-Volume | View examples |
| Inspect pool capacity | Get-StoragePool -FriendlyName 'AppPool' |
Select-Object Size, AllocatedSize, HealthStatus, OperationalStatus | View examples |
| Preview adding a disk | $pool | Add-PhysicalDisk -PhysicalDisks $disk -WhatIf | View examples |
| Preview virtual-disk growth | Resize-VirtualDisk -FriendlyName 'AppData' -Size 750GB `
-WhatIf | View examples |
| Inspect storage jobs | Get-StorageJob |
Select-Object Name, JobState, PercentComplete, ElapsedTime, IsBackgroundTask | View examples |
| Preview virtual-disk repair | Repair-VirtualDisk -FriendlyName 'AppData' -WhatIf | View examples |
Storage Spaces aggregates eligible physical disks into pools, then presents resilient virtual disks for partitioning and formatting. Pool creation, retirement, reset, and repair can relocate or destroy data, so run administrative changes elevated, identify devices by unique identifiers rather than friendly names, validate enclosure and fault-domain design, and maintain an independent tested backup. This guide covers standalone Storage Spaces, not Storage Spaces Direct cluster deployment.
Step by step
Detailed examples
Record topology and stable device identity
Friendly names and disk numbers can change across ports, boots, and replacements. Capture UniqueId, serial number, enclosure and slot where available, media type, size, pool membership, health, and operational state. Disk firmware and controller presentation also affect supportability. Most Storage cmdlet mutations require elevation.
Get-StoragePool | Select-Object FriendlyName, UniqueId, IsPrimordial, HealthStatus, OperationalStatus, Size, AllocatedSize
Get-PhysicalDisk | Select-Object FriendlyName, UniqueId, SerialNumber, EnclosureNumber, SlotNumber, MediaType, CanPool, HealthStatus, OperationalStatus, Size Validate eligibility, fault domains, and resiliency first
CanPool is a discovery signal, not permission to consume a disk. A disk may contain valuable data or belong to another platform even when reported eligible. Verify serials physically, back up data, clear ownership through an approved process, and model disk failures. Simple spaces provide no redundancy; mirror and parity have different capacity, write, and repair characteristics.
$candidates = Get-PhysicalDisk -CanPool $true
$candidates | Select-Object FriendlyName, UniqueId, SerialNumber, MediaType, Size
Get-StorageSubSystem | Select-Object FriendlyName, UniqueId, HealthStatus
Get-StoragePool -FriendlyName 'AppPool' | Get-ResiliencySetting Provision from an explicit immutable selection
New-StoragePool claims the selected disks for the subsystem. Bind an reviewed collection of UniqueIds immediately before execution; do not pipe every CanPool disk into production automation. For virtual disks, specify resiliency and size intentionally and review pool defaults, column count, enclosure awareness, provisioning type, and filesystem support for the workload.
$approvedIds = @('DISK-UNIQUE-ID-01', 'DISK-UNIQUE-ID-02')
$disks = Get-PhysicalDisk | Where-Object UniqueId -in $approvedIds
$disks | Select-Object FriendlyName, UniqueId, SerialNumber, CanPool, Size
New-StoragePool -FriendlyName 'AppPool' -StorageSubsystemFriendlyName 'Windows Storage*' -PhysicalDisks $disks -WhatIf
New-VirtualDisk -StoragePoolFriendlyName 'AppPool' -FriendlyName 'AppData' -ResiliencySettingName Mirror -Size 500GB -WhatIf Keep virtual disk, partition, and filesystem decisions separate
A virtual disk is a storage-space object; it becomes usable only after the corresponding disk is initialized, partitioned, and formatted. Those are distinct destructive state transitions and a final WhatIf does not protect earlier pipeline stages. Confirm UniqueId and absence of mounted data, choose NTFS or ReFS based on workload support, and require a backup and maintenance window before any initialization or formatting.
$space = Get-VirtualDisk -FriendlyName 'AppData'
$space | Select-Object FriendlyName, UniqueId, ResiliencySettingName, ProvisioningType, HealthStatus, Size
$space | Get-Disk | Select-Object Number, UniqueId, PartitionStyle, OperationalStatus, Size
$space | Get-Disk | Get-Partition | Get-Volume
# Initialize-Disk, New-Partition, and Format-Volume are separate approved changes; never hide them in a partially previewed pipeline. Expand each storage layer deliberately
Adding disks increases raw pool capacity but does not automatically grow every virtual disk, partition, or filesystem. Validate replacement compatibility and fault-domain placement, add one approved disk set, then expand the virtual disk and finally the partition within supported limits. Thin provisioning still needs alerts well before physical exhaustion.
$pool = Get-StoragePool -FriendlyName 'AppPool'
$pool | Select-Object Size, AllocatedSize, HealthStatus, OperationalStatus
$disk = Get-PhysicalDisk | Where-Object UniqueId -eq 'DISK-UNIQUE-ID-03'
$pool | Add-PhysicalDisk -PhysicalDisks $disk -WhatIf
Resize-VirtualDisk -FriendlyName 'AppData' -Size 750GB -WhatIf Diagnose before repair or retirement
Warnings can originate at physical disk, pool, virtual disk, volume, controller, or enclosure layers. Capture all states and Windows storage events before changing usage. Repair consumes redundancy and free capacity and can stress remaining hardware. Retiring or resetting a disk can make data unavailable; follow the supported replacement sequence and confirm repair completion before removal.
Get-PhysicalDisk | Select-Object FriendlyName, UniqueId, HealthStatus, OperationalStatus, Usage
Get-StoragePool -FriendlyName 'AppPool' | Select-Object HealthStatus, OperationalStatus, Size, AllocatedSize
Get-VirtualDisk | Select-Object FriendlyName, HealthStatus, OperationalStatus, DetachedReason
Get-StorageJob
Repair-VirtualDisk -FriendlyName 'AppData' -WhatIf Sources and further reading
References
Authoritative documentation used to verify and expand this cheat sheet.
Help us improve
Found a typo or missing example?
Tell us what would make this cheat sheet clearer, more complete, or more useful.



