Verificando o alinhamento da partição com o PowerCLI

5

Estou tentando verificar se as partições do sistema de arquivos em cada um dos servidores em que estou trabalhando estão alinhadas corretamente. Eu tenho o script a seguir que quando eu tentei correr vai alegar que todos os servidores virtuais estão alinhados ou não alinhados com base em qual declaração se eu usar (um está comentado):

$myArr = @()
$vms = get-vm | where {$_.PowerState -eq "PoweredOn" -and $_.Guest.OSFullName -match "Microsoft Windows*" } | sort name
foreach($vm in $vms){
    $wmi = get-wmiobject -class "win32_DiskPartition" -namespace "root\CIMV2" -ComputerName $vm
    foreach ($partition in $wmi){
        $Details = "" | Select-Object VMName, Partition, Status
        #if (($partition.startingoffset % 65536) -isnot [decimal]){
        if ($partition.startingoffSet -eq "65536"){
            $Details.VMName = $partition.SystemName
            $Details.Partition = $partition.Name
            $Details.Status = "Partition aligned"
        }
        else{
            $Details.VMName = $partition.SystemName
            $Details.Partition = $partition.Name
            $Details.Status = "Partition not aligned"
        }
    $myArr += $Details
    }
}
$myArr | Export-CSV -NoTypeInformation "C:\users\myself\Documents\Scripts\PartitionAlignment.csv"

Alguém saberia o que há de errado com o meu código? Eu ainda estou aprendendo sobre partições, então não tenho certeza de como preciso verificar o número inicial de deslocamento para verificar o alinhamento.

EDITAR:

    $myArr = @()
    $vms = get-vm | where {$_.PowerState -eq "PoweredOn" -and $_.Guest.OSFullName -match "Microsoft Windows*" } | sort name
    $wmi = get-wmiobject -class "win32_DiskPartition" -namespace "root\CIMV2" -ComputerName $vm
    #foreach ($_ In Get-WMIObject Win32_DiskPartition | Select Name, BlockSize, NumberOfBlocks, StartingOffSet, @{n='Alignment'; e={$_.StartingOffSet/$_.BlockSize}}) {$_}
    foreach ($wmi| Select Name, BlockSize, NumberOfBlocks, StartingOffSet, @{n='Alignment'; e={$_.StartingOffSet/$_.BlockSize}}) {$_}
    
por Valrok 24.10.2013 / 20:25

1 resposta

4

Bem, vejo que você comentou a linha que tenta fazer a aritmética real. Seu código como está agora diz "if partition starting offset = 65536 then partition is aligned" .

Não é assim que funciona. As partições têm todos os tipos de compensações iniciais. A classe WMI retorna 2 partições no meu laptop agora, nenhuma das quais tem um deslocamento inicial de 65536.

Em segundo lugar, mesmo se você não comentou a linha acima dela, aquela em que ela divide o deslocamento inicial por 65536 e compara o restante com o tipo de dados Decimal ... não é assim que funciona. Não use o tipo decimal.

PS C:\> 1 -Is [Decimal]
False
PS C:\> 1.23 -Is [Decimal]
False

Ambos avaliam como falso. Isso não vai dizer se a divisão resultou em um remanescente ou não.

Dê um giro:

Foreach($_ In Get-WMIObject Win32_DiskPartition | Select Name, BlockSize, NumberofBlocks, StartingOffset, @{n='Alignment';e={$_.StartingOffset/$_.BlockSize}}) { $_ }

Name           : Disk #0, Partition #0
BlockSize      : 512
NumberofBlocks : 614400
StartingOffset : 1048576
Alignment      : 2048

Name           : Disk #0, Partition #1
BlockSize      : 512
NumberofBlocks : 487778304
StartingOffset : 315621376
Alignment      : 616448

Se Alignment for um número inteiro, você é bom. Se é um decimal, o alinhamento está errado.

Aqui está um bom artigo sobre alinhamento de partições:

link

A propósito, isso não é algo com o qual você normalmente precisa se preocupar em VMs do Windows 2008+. O Windows pode manipular seu próprio alinhamento de partição. Windows 2003 e abaixo, talvez.

    
por 24.10.2013 / 21:37