0

I am trying to get all not used SessionHosts in a RDS Deployment.

At the end of the code I get two lists with all SessionHosts and all used SessionHosts and these two lists I want to compare to get all unused hosts.

For the comparison, I tried 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 $_})

Result

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

But there are only two unused: SessionHost8 and SessionHost12

P2scal
  • 21
  • 5

1 Answers1

0

To find items in one array those are not in another array you should use Where-Object cmdlet and comparisson operator such as -contains or -notcontains. Like so:

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

Also, in your code $used variable will always contain just one item because you are overwriting its value on every foreach loop.

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

You would want to create an array variable explicitly and add used hosts values into.

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

And for filtering unused SessionHosts you probably want to use $RDSessionCollections

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

instead of $RDSessionHost

$unused = ($RDSessionHost | Where {$used -NotContains $_})
Kirill Pashkov
  • 3,118
  • 1
  • 15
  • 20