比较软件版本使用PowerShell在一组动态服务器名称之间进行比较

时间:2013-05-27 13:10:18

标签: arrays powershell

我想比较安装在多台服务器上的软件版本,服务器列表是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但它只支持两个对象的比较,我怎样才能在多个服务器上比较一个产品的相同软件版本,让我知道一个“真”或“假”语句,表明该软件是否所有服务器上的版本都是相同的。

1 个答案:

答案 0 :(得分: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-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