web-dev-qa-db-ja.com

PowerCLIを使用したパーティションの配置の確認

作業中の各サーバー内のファイルシステムパーティションが正しく配置されていることを確認しようとしています。次のスクリプトを実行しようとすると、使用するifステートメントに基づいてすべての仮想サーバーが整列されているか整列されていないと主張します(1つはコメントアウトされています)。

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

さて、あなたは実際の算術を行おうとする行をコメントアウトしたようです。現在のコードは"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

それらは両方とも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 + VMで通常心配する必要のあることではありません。 Windowsは、独自のパーティション配置を処理できます。 Windows2003以下かもしれません。

4
Ryan Ries