martes, 23 de abril de 2013

Gestionar discos con Powershell



Powershell nos da suficiente potencial para poder gestionar el sistema operativo, entre otras cosas el poder trabajar con los discos duros. Veamos un ejemplo practico, tengo una máquina virtual (física también vale) a la que le añado un disco RAW y quiero inicializarlo, formatearlo y etiquetarlo en un script.
Lo primero que necesitamos es saber el número de disco que se ha generado al añadir el nuevo disco, para ello desde el PowerShell ejecutamos el comando Get-Disk.


Como se ve existe un disco con el numero 1 offline y de tipo RAW.

Aquí también podemos utilizar los filtros de powershell para que solo nos muestre el de tipo RAW. Usamos el comando get-disk |Where {$_.PartitionStyle -eq "RAW"}






Lo primero que deberemos hacer es inicializar el disco en formato MBR, para ello usamos el cmdlet Initialize-Disk -Number 1 -PartitionStyle MBR tal como se ve en la imagen.



Una vez inicializado debemos crear la partición y después formatearlo, para lo primero ejecutamos el comando New-Partition -DiskNumber 1 -UseMaximumSize


En el ejemplo anterior no le hemos asignado la letra de unidad que queremos ya que lo que vamos a hacer es montar este disco sobre una carpeta, si quisiéramos asignarle una unidad podíamos haberlo hecho al formatear la unidad añadiendo el flag –AssignDriveLetter.

Para formatearlo en NFTS dándole como etiqueta el nombre “Datos” primero vemos cual es el número de partición creada y luego lo formateamos con el comando Get-Partition -DiskNumber 1 | Format-Volume -FileSystem NTFS -NewFileSystemLabel "Datos" -Confirm:$false


Ahora nos queda montarlo sobre una carpeta de sistema, como ejemplo hemos creado una carpeta sobre el disco C:\ llamada Datos, para montar esta unidad sobre esta carpeta ejecutamos el comando Add-PartitionAccessPath -DiskNumber 1 -PartitionNumber 1 -AccessPath "C:\Datos"



Si vamos al explorador veremos cómo nos ha cambiado el icono de esta carpeta indicándonos que es un punto de montaje.


Obviamente podemos utilizar estos cmdlets para crearnos un script que lo haga todo, incluso localizar el disco que acabamos de asignar.
Aquí os dejo un ejemplo de un script que busca el primer disco RAW disponible lo inicializa y formatea con la siguiente unidad disponible, permite pasarle como parametro el label del nuevo disco.



# - Script que busca un disco libre lo inicializa, lo formatea, le pone la etiqueta que
# - le pasamos como parametro -Label y lo monta en la siguiente unidad libre.
[CmdletBinding()]
Param (
 [Parameter (Mandatory=$True, Position=1)]
 [String]$Label
 )
# -- Variables a usar
$NDisco=""
# -- Convierto a mayusculas la etiqueta pasada (mania mia)
$Label=$Label.ToUpper()
# -- Comprueba si hay discos disponibles
 
$NDisco=@(Get-Disk | where {$_.PartitionStyle -eq "RAW"} |Sort-Object Number)
if ($NDisco.count -gt 0 )
{
 # - Hay más de un disco.
 # -- Inicializo.
 Initialize-Disk -Number $NDisco[0].Number -PartitionStyle MBR
 # -- Creo la partición
 $Particion=New-Partition -DiskNumber $NDisco[0].Number -UseMaximumSize -AssignDriveLetter
 # -- Formateo la partición
 Start-Sleep -Seconds 3
 $Particion | Format-Volume -FileSystem NTFS -NewFileSystemLabel $Label -Confirm:$false
 # -- Ya está
 Write-Host "Disco creado"
 }
else {
 Write-Host "No hay discos disponibles"
}