Share via


Windows: Hide message "You need to format the disk in drive before you can use it" using PowerShell

Introduction

When you work on a script, and want to format or create a new partition, volume or clean drive, you will be confronted with the annoying message prompt "You need to format the disk drive" or a new window explorer when your drive is created.

like these :

When you click on cancel displays another prompt stating that the drive is not accessible.

these errors occur because a letter is assigned to drive and sometimes it is not well formatted with RAW parition.

Solution : 

some prefer to disable autoplay, others not to assign a letter to drive. there is no good solution for the script, we will see together how to deal with this problem with shellwindows object

**Step : **

  • (facultative) format for exemple our drive without create a new partition
  • create a partition or new volume withaout assign a letter, but chose a label
  • assign letter to drive or partition, and then close explorer message box

About ShellWindows object

Represents a collection of the open windows that belong to the Shell. Methods associated with this objects can control and execute commands within the Shell, and obtain other Shell-related objects. you can find more information here Link

Create the variable : 

$shell = New-Object -ComObject Shell.Application

Format your Drive : 

Clear-Disk -Number $disk -RemoveData -RemoveOEM -Confirm:$false -PassThru<br>

Create your partition or your volume but d'ont forget to chose a label, in our exemple the label will be "CMCiso-source' :

New-Partition -DiskNumber $disk -UseMaximumSize  | Format-Volume -FileSystem NTFS -NewFileSystemLabel 'CMCiso-Source'

Now we will assign a letter to our driver, dont forget to change partitionnumber with your partition, and variable $disk with number of you drive.

Add-PartitionAccessPath -DiskNumber $disk -PartitionNumber '1' -AssignDriveLetter -Confirm:$false

Just after we will close new window, or message box, for drive with label 'CMC'

foreach ($window in ($shell.Windows() | Where-Object { $_.LocationURL -like "$(([uri]"*CMCiso*").AbsoluteUri)*" }))
{
$window.Quit()
}

Conclusion

With this method, you will no longer have a windows message, to adapt it according to your needs, sometimes on old media USB, it will be interesting to add a sleep 2 seconds before the loop foreach.