Проверьте, есть ли имя хоста в массиве

#powershell

#powershell

Вопрос:

У меня есть массив с исключениями типа:

 $hosts= @("*iphone*","*Samsung*")
  

Я хотел бы исключить эти хосты из моих dhcp-договоров аренды, например:

 Get-DhcpServerv4Lease -ComputerName $dhcp_server -ScopeId $scope.ScopeID |ForEach-Object {
        if(($_) -and $_.Hostname -notlike $hostnames -and $_.ClientID -notlike $clientids  -and $_.Description -notlike $descriptions) {
do something
  

Когда я работаю без массива, например:

 $leases  = Get-DhcpServerv4Lease -ComputerName $dhcp_server -ScopeId $scope.ScopeID | 
           where {$_.Hostname -notlike "*iphone*" -and $_.Hostname -notlike... 
  

это уже работает нормально.

Итак, я понятия не имею, почему это не работает, когда исключения находятся в массиве вместо предложения where

Комментарии:

1. что ж, проблема, похоже, в том, что вы назвали коллекцию, $Hosts но вы использовали $HostNames в своем сравнении. [ усмешка ] ///// вы думали об использовании вместо этого теста регулярных выражений? -notmatch 'iphone|samsung' дало бы тот же результат и, возможно, было бы немного быстрее.

Ответ №1:

AFAIK вы не должны использовать -notlike для сравнения с массивом. Вы можете сделать это с помощью оператора регулярного выражения -notmatch . Для этого вы объединяете параметры в массиве с регулярным выражением ИЛИ символом | .

 $hosts= ("iphone","Samsung" | ForEach-Object { [Regex]::Escape($_) }) -join '|'
  

приводит к iphone|Samsung .

Обратите внимание на использование [Regex]::Escape() , чтобы убедиться, что специальные символы регулярного выражения экранируются, чтобы они воспринимались как литералы.

Для этого используйте предложение Where-Object, подобное этому:

 Where-Object {$_.Hostname -notmatch $hosts}
  

Сделайте то же самое для $clientids и $descriptions