PowerShell Set-PhysicalDisk quando houver nomes de FriendlyName idênticos

1

Eu corri Get-PhysicalDisk dentro de uma máquina virtual com 4 discos rígidos. O resultado foi:

FriendlyName             SerialNumber CanPool OperationalStatus HealthStatus Usage         Size
------------             ------------ ------- ----------------- ------------ -----         ----
VMware, VMware Virtual S              False   OK                Healthy      Auto-Select  60 GB
VMware, VMware Virtual S              False   OK                Healthy      Auto-Select 100 GB
VMware, VMware Virtual S              False   OK                Healthy      Auto-Select 200 GB
VMware, VMware Virtual S              False   OK                Healthy      Auto-Select 400 GB

Não havia nenhum número de série ou qualquer outro código único que eu pudesse ver no resultado acima.

Agora, preciso executar Set-PhysicalDisk . Todos os exemplos na Web usam o exclusivo FriendlyName ou algo parecido com PhysicalDisk1 . Primeiro, existem 4 discos com o mesmo nome de FriendlyName, então acho que não posso usá-lo. Em segundo lugar, achei que PhysicalDisk{number} era um nome especial para apontar um disco pelo índice, mas não parecia funcionar.

O que devo passar para Set-PhysicalDisk , se eu quiser designar, digamos, o segundo disco acima (tamanho = 100GB)?

PS C:\Users\Administrator> Set-PhysicalDisk -FriendlyName "VMware, VMware Virtual S" -Usage Retired
Set-PhysicalDisk : Not Supported
At line:1 char:1
+ Set-PhysicalDisk -FriendlyName "VMware, VMware Virtual S" -Usage Reti ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (StorageWMI:ROOT/Microsoft/..._StorageCmdlets) [Set-PhysicalDisk], CimException
    + FullyQualifiedErrorId : StorageWMI 1,Set-PhysicalDisk

PS C:\Users\Administrator> Set-PhysicalDisk PhysicalDisk1 -Usage Retired
Set-PhysicalDisk : The requested object could not be found.
At line:1 char:1
+ Set-PhysicalDisk PhysicalDisk1 -Usage Retired
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (PS_StorageCmdlets:ROOT/Microsoft/..._StorageCmdlets) [Set-PhysicalDisk], CimException
    
por Damn Vegetables 28.09.2016 / 09:56

2 respostas

1

Você pode Set-PhysicalDisk usando o UniqueID .

Para recuperar o UniqueID

Get-PhysicalDisk | Select-Object SerialNumber,UniqueID

Para fazer atualizações com base no UniqueID ,

Set-PhysicalDisk -UniqueId "{<insert_UniqueID>}"
    
por 29.09.2016 / 18:00
1

Você pode atribuir esse disco "objeto" a uma variável. Com essa variável, você pode executar as operações na própria variável, sem precisar de um FriendlyName ou um SerialNumber

Detalhes

No meu caso, eu tinha não FriendlyName , nem qualquer SerialNumber :

FriendlyName   CanPool  OperationalStatus   HealthStatus  Usage             Size
------------   -------  -----------------   ------------  -----             ----
PhysicalDisk1  False    OK                  Healthy       Auto-Select    1.82 TB
PhysicalDisk3  False    OK                  Healthy       Auto-Select    1.82 TB
PhysicalDisk4  False    OK                  Healthy       Auto-Select    1.82 TB
PhysicalDisk0  False    OK                  Healthy       Auto-Select  111.79 GB
PhysicalDisk8  False    OK                  Healthy       Auto-Select    1.82 TB
PhysicalDisk2  False    OK                  Healthy       Auto-Select  465.76 GB
               False    Lost Communication  Warning       Retired      930.75 GB
PhysicalDisk6  False    OK                  Healthy       Auto-Select  930.75 GB
PhysicalDisk9  False    OK                  Healthy       Auto-Select  930.75 GB
PhysicalDisk7  False    OK                  Healthy       Auto-Select    1.82 TB
PhysicalDisk5  False    OK                  Healthy       Auto-Select    1.82 TB

A coisa mais fácil que eu poderia digitar era que o OperationalStatus dizia Lost Communication :

#Single out the disk that has lost communication
Get-PhysicalDisk | Where-Object { $_.OperationalStatus -eq 'Lost Communication' }

A partir daí, posso atribuir esse disco a uma variável:

#Assign the missing disk to a variable
$missingDisk = Get-PhysicalDisk | Where-Object { $_.OperationalStatus -eq 'Lost Communication' }

Agora que tenho um objeto variável, posso marcar esse disco como desativado:

#tell the storage pool that the disk has been retired:
$missingDisk | Set-PhysicalDisk -Usage Retired

E, para finalizar, repare todos os volumes no espaço de armazenamento afetados:

# To Repair all Warning Volumes
Get-VirtualDisk | Where-Object –FilterScript {$_.HealthStatus –Eq 'Warning'} | Repair-VirtualDisk

Você pode confirmar que um disco virtual está sendo reparado, pois seu OperationStatus é InService :

#Disks will show as 'InService' to let us know that they're currently being repaired
Get-VirtualDisks

FriendlyName      ResiliencySettingName  OperationalStatus  HealthStatus  IsManualAttach   Size
------------      ---------------------  -----------------  ------------  --------------   ----
Three-way mirror  Mirror                 InService          Warning       False           10 TB
PooledParityDisk  Parity                 InService          Warning       False           15 TB

E, finalmente, você pode monitorar o progresso do reparo:

#Monitor the percentage of the repair
Get-StorageJob

Name          ElapsedTime  JobState  PercentComplete  IsBackgroundTask
----          -----------  --------  ---------------  ----------------
Regeneration  00:00:00     Running   40               True
Regeneration  00:00:00     New       0                True

Agradecimentos a Matthew Hodgkins . ( arquivo )

p.s. a pessoa que pensa que o PowerShell é uma boa ideia deve ser filmada

    
por 24.08.2017 / 01:53

Tags