1

我想比较安装在多台服务器上的软件版本,服务器列表是 DAG 集群的一部分,如下所示。

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

Name
----
VMAPPSNODE3
VMAPPSNODE2
VMAPPSNODE1

现在作为 DAG 一部分的服务器数量可以在 1--16 之间,我想要一种方法来比较 thsi 服务器中特定软件的软件版本。

我可以做一些类似下面的事情,但是你可以看到 DAG 服务器的数量不是固定的,它是一个动态变量,

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

我尝试了 compare-object,但它只支持比较两个对象,我如何才能在多个服务器上比较产品的相同软件版本,并让我知道一个“真”或“假”语句,表明软件版本是否相同是否跨所有服务器。

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
....

我已经使用并推荐-FilterinGet-WmiObject而不是where-object (?). Where-Object查询所有产品,然后使用 过滤where,而-Filter参数在搜索期间执行,这要快得多。两种方式都可以,只是节省时间(但需要稍微不同的过滤器样式where-object

您可以随意扩展它,例如。真/假:DAG 中只有一个版本

@(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 回答