Я пытаюсь проверить правильность выравнивания разделов файловой системы на каждом из серверов, над которыми я работаю. У меня есть следующий сценарий, который, когда я пробовал запустить, будет либо утверждать, что все виртуальные серверы выровнены или не выровнены, в зависимости от того, какой оператор 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}}) {$_}
Что ж, я вижу, вы закомментировали строку, которая пытается произвести арифметические действия. Ваш код, как он сейчас, говорит "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 и ниже.