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