Проверка выравнивания разделов с помощью PowerCLI

Я пытаюсь убедиться, что разделы файловой системы на каждом из серверов, над которыми я работаю, выровнены правильно. У меня есть следующий сценарий, который, когда я попытался запустить, будет утверждать, что все виртуальные серверы выровнены или не выровнены в зависимости от того, какой оператор if я использую (один закомментирован):

$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"

Кто-нибудь знает, что не так с моим кодом? Я все еще изучаю разделы, поэтому я не уверен, как мне нужно проверять начальный смещенный номер, чтобы проверить выравнивание.

РЕДАКТИРОВАТЬ:

    $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}}) {$_}

1 ответ

Ну, я вижу, вы прокомментировали строку, которая пытается сделать фактическую арифметику. Ваш код, как он сейчас говорит "if partition starting offset = 65536 then partition is aligned",

Это не так, как это работает. У разделов есть все виды начальных смещений. Класс WMI возвращает 2 раздела на моем ноутбуке прямо сейчас, ни один из которых не имеет начального смещения 65536.

Во-вторых, даже если вы раскомментировали строку над ней, ту, где она делит начальное смещение на 65536 и сравнивает остаток с типом данных Decimal... это тоже не так. Не используйте десятичный тип.

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

Они оба оценивают как ложные. Это не собирается сказать, привело ли разделение к остатку или нет.

Дайте это вихрь:

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

Если Alignment это целое число, ты хороший. Если это десятичное число, выравнивание неверно.

Вот хорошая статья о выравнивании разделов:

http://technet.microsoft.com/en-us/library/dd758814(v=SQL.100).aspx

Кстати, это не то, о чем вам обычно нужно беспокоиться на виртуальных машинах Windows 2008+. Windows может обрабатывать собственное выравнивание разделов. Windows 2003 и ниже, возможно.

Другие вопросы по тегам