使用 PowerCLI 检查分区对齐

Val*_*rok 5 powershell vmware-esxi powercli partition-alignment

我正在尝试验证我正在处理的每台服务器中的文件系统分区是否正确对齐。我有以下脚本,当我尝试运行时,将根据我使用的 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"
Run Code Online (Sandbox Code Playgroud)

有谁知道我的代码有什么问题?我仍在学习分区,所以我不确定我需要如何检查起始偏移量以验证对齐。

编辑:

    $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}}) {$_}
Run Code Online (Sandbox Code Playgroud)

Rya*_*ies 4

好吧,我看到您已经注释掉了尝试进行实际算术的行。您现在的代码表示"if partition starting offset = 65536 then partition is aligned"

事情不是这样的。分区具有各种起始偏移量。WMI 类现在在我的笔记本电脑上返回 2 个分区,这两个分区的起始偏移量都不是 65536。

其次,即使您取消注释上面的行,它将起始偏移量除以 65536 并将余数与 Decimal 数据类型进行比较......这也不是它的工作方式。不要使用 Decimal 类型。

PS C:\> 1 -Is [Decimal]
False
PS C:\> 1.23 -Is [Decimal]
False
Run Code Online (Sandbox Code Playgroud)

他们都评估为假。这并不能说明除法是否产生余数。

尝试一下:

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
Run Code Online (Sandbox Code Playgroud)

如果Alignment是整数,那就很好。如果是小数,则对齐错误。

这是一篇关于分区对齐的好文章:

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

顺便说一句,在 Windows 2008+ 虚拟机上,这通常不需要担心。Windows 可以处理自己的分区对齐。也许是 Windows 2003 及更低版本。