#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