获取远程桌面服务部署中的所有未使用的SessionHosts

时间:2018-10-08 08:32:33

标签: powershell deployment windows-server-2012-r2

我正在尝试让RDS部署中所有未使用的SessionHosts。

在代码的结尾,我得到了两个列表,其中包含所有SessionHosts和所有使用过的SessionHosts,我想比较这两个列表以获取所有未使用的主机。

为进行比较,我尝试了https://stackoverflow.com/a/6368667/6708104

# ALL SessionHosts
$RDSessionHost = (Get-RDserver -Role "RDS-RD-SERVER" -ConnectionBroker $ConnectionBrooker).Server
Write-Host "Alle SessionHosts:" -ForegroundColor Green

# All SessionCollections
$RDSessionCollections = (Get-RDSessionCollection -ConnectionBroker $ConnectionBrooker).Collectionname

# ALL used SessionHosts
foreach($p in $RDSessionCollections){
$used = (Get-RDSessionHost -CollectionName $p -ConnectionBroker $ConnectionBrooker).SessionHost
}

#ALL unused SessionHosts
$unused = ($RDSessionHost | Where {$used -NotContains $_})

结果

ALL SessionHosts:
SessionHost1
SessionHost2
SessionHost12
SessionHost11
SessionHost10
SessionHost9
SessionHost6
SessionHost8
SessionHost5
SessionHost3
SessionHost4
SessionHost7

ALL USED SessionHosts:
SessionHost1
SessionHost2
SessionHost11
SessionHost10
SessionHost9
SessionHost6
SessionHost7
SessionHost5
SessionHost4
SessionHost3

ALL UNUSED SessionHosts:
SessionHost1
SessionHost2
SessionHost12
SessionHost11
SessionHost10
SessionHost9
SessionHost6
SessionHost8
SessionHost5
SessionHost3
SessionHost4
SessionHost7

但是只有两个未使用的空间:SessionHost8和SessionHost12

1 个答案:

答案 0 :(得分:0)

要在一个array中查找不在另一个array中的项目,则应使用Where-Object cmdlet和比较运算符,例如-contains-notcontains。像这样:

$array1 = @('A','B','C','D','E','F')
$array2 = @('A','B','F')
$array1 | Where-Object {$array2 -notcontains $_ }
C
D
E

此外,在代码$used中,变量始终只包含一项,因为您在每个foreach循环中都将其值覆盖。

# ALL used SessionHosts
foreach($p in $RDSessionCollections){
$used = (Get-RDSessionHost -CollectionName $p -ConnectionBroker $ConnectionBrooker).SessionHost
}

您可能要显式创建array variable并将使用的主机值添加到其中。

# ALL used SessionHosts
$used = @()
foreach($p in $RDSessionCollections){
$used += (Get-RDSessionHost -CollectionName $p -ConnectionBroker $ConnectionBrooker).SessionHost
}

对于过滤未使用的SessionHost,您可能要使用$RDSessionCollections

$unused = ($RDSessionCollections| Where {$used -NotContains $_})

代替$RDSessionHost

$unused = ($RDSessionHost | Where {$used -NotContains $_})