How to Create a Windows Server Storage Pool using PowerShell

Modernizing Storage with Storage Spaces

Historically, if a Windows Server administrator wanted to combine multiple physical hard drives into a single resilient volume, they had to rely on a hardware RAID controller card. While hardware RAID is effective, it is inflexible. If the RAID controller dies, you often lose access to the data unless you have an identical replacement card.

Microsoft solved this with Storage Spaces, a software-defined storage technology built directly into the Windows Server operating system. Storage Spaces allows you to take a heterogeneous mix of physical disks (e.g., three SATA HDDs and two NVMe SSDs), group them into a logical Storage Pool, and then carve out virtual disks (vDisks) from that pool with built-in mirroring or parity protection. If the server hardware dies, you can simply move the physical drives to a new Windows Server, and the operating system will instantly recognize the pool.

While you can configure this in the Server Manager GUI, using PowerShell is significantly faster and allows for scripted deployments.

Step 1: Identifying the Physical Disks

Before you can create a pool, you must identify which physical disks are available to be pooled. Disks that already contain a partition (like your C: drive) cannot be added.

Open PowerShell as an Administrator and run:

Get-PhysicalDisk -CanPool $true

This command outputs a list of all raw, unformatted disks connected to the server. Note the FriendlyName of the disks (e.g., PhysicalDisk1, PhysicalDisk2, PhysicalDisk3).

Step 2: Creating the Storage Pool

Now, you will group those physical disks into a single logical entity. We will name our new pool “DataPool”.

$Disks = Get-PhysicalDisk -CanPool $true
New-StoragePool -FriendlyName "DataPool" -StorageSubsystemFriendlyName "Windows Storage*" -PhysicalDisks $Disks

This command grabs all available disks and aggregates their raw capacity into DataPool. If you run Get-StoragePool, you will see your new pool listed with its combined total capacity.

Step 3: Creating the Virtual Disk

The Storage Pool is just a container. To actually store data, you must carve a Virtual Disk out of the pool. This is where you define your resilience strategy (mirroring vs. parity).

Let’s create a 500GB virtual disk named “FinanceData” with a 2-way mirror (which requires at least two physical disks in the pool):

New-VirtualDisk -StoragePoolFriendlyName "DataPool" -FriendlyName "FinanceData" -Size 500GB -ResiliencySettingName Mirror -ProvisioningType Thin

We used Thin Provisioning, meaning the virtual disk will immediately appear as a 500GB drive to the operating system, but it will only consume actual physical capacity from the Storage Pool as data is written to it.

Step 4: Initializing and Formatting the Volume

The virtual disk now exists, but Windows cannot use it until it is initialized, partitioned, and formatted with a file system.

You can perform all three actions in a single powerful pipeline:

Get-VirtualDisk -FriendlyName "FinanceData" | Get-Disk | Initialize-Disk -PassThru | New-Partition -DriveLetter F -UseMaximumSize | Format-Volume -FileSystem NTFS -NewFileSystemLabel "Finance_Share" -Confirm:$false

The pipeline executes seamlessly: it grabs the new virtual disk, initializes the partition table, assigns the F: drive letter, creates a partition utilizing the full 500GB size, and formats it securely with the NTFS file system. The drive is now instantly available in File Explorer, ready for network sharing.

Get the best tech tips delivered straight to your inbox.

Join thousands of readers mastering Apple, Google, Microsoft, and Linux.