1

複数のサーバーにインストールされているソフトウェアのバージョンを比較したかったのですが、サーバーのリストは DAG クラスターの一部であり、以下に示すように.

PS C:\Windows\system32\drivers> Get-DatabaseAvailabilityGroup | select -ExpandProperty servers | select name

Name
----
VMAPPSNODE3
VMAPPSNODE2
VMAPPSNODE1

現在、DAG の一部であるサーバーの数は 1 から 16 の間である可能性があります。これらのサーバーで特定のソフトウェアのソフトウェア バージョンを比較する方法が必要でした。

以下のようなことを行うこともできますが、ご覧のとおり、DAG サーバーの数は固定されておらず、動的変数です。

$VMAPPSNODE3 = get-wmiobject Win32_product |?{.....
$VMAPPSNODE2 = get-wmiobject Win32_product |?{.....
.
.
.
.
.

compare-object を試しましたが、2 つのオブジェクトの比較しかサポートしていません。複数のサーバー間で製品の同じソフトウェア バージョンを比較し、ソフトウェア バージョンが同じかどうかを示す "True" または "False" ステートメントを知るにはどうすればよいでしょうか。すべてのサーバー間かどうか。

4

1 に答える 1

2

foreach ループを使用できます。これを試して:

Get-DatabaseAvailabilityGroup | % {
    $name = $_.Name
    Get-WmiObject win32_product -Filter "name like 'Powershell%'" -ComputerName $name | % { 
        New-Object psobject -Property {
            ComputerName = $name
            Version = $_.Version
        }
    }
}

サンプル出力:

ComputerName                                      Version
------------                                      -------
VMAPPSNODE3                                       3.0.4.0 
VMAPPSNODE2                                       3.0.4.0
....

の代わりにを使用し、推奨-Filterしています。すべての製品を照会してから を使用してフィルタリングしますが、パラメーターは検索中にそれを行います。これは非常に高速です。どちらの方法でも機能します。時間の節約になります (ただし、少し異なるフィルター スタイルが必要です) 。Get-WmiObjectwhere-object (?)Where-Objectwhere-Filterwhere-object

これは好きなように拡張できます。正誤問題: DAG にはバージョンが 1 つしかない

@(Get-DatabaseAvailabilityGroup | % {
    $name = $_.Name
    Get-WmiObject win32_product -Filter "name like 'Powershell%'" -ComputerName $name | % { 
        New-Object psobject -Property {
            ComputerName = $name
            Version = $_.Version
        }
    }
} | Select-Object Version -Unique).Count -eq 1

True
于 2013-05-27T14:16:40.213 に答える