Powershell 2.0: как сопоставить или как строку в ключах хеш-таблицы

#string #key #match #hashtable #powershell-2.0

#строка #Клавиша #сопоставление #хеш-таблица #powershell-2.0

Вопрос:

Для Powershell 2.0:

У меня есть хеш-таблица с несколькими строками в качестве ключей. В отличие @{}.containskey от, возможно ли найти ключ (например, "examplekey" ) с помощью подстановочных знаков (например, "*xampl*" )?

Мне удалось выполнить то, что я хотел, составив список ключей и используя Where-Object в качестве фильтра. Но есть ли более простой способ сделать это? Я думаю, что этот метод особенно плох, когда я добавляю новые ключи, потому что мне нужно каждый раз заново создавать список.

Ответ №1:

Используйте .Keys операторы свойств и -like или -notlike , которые возвращают массив ключей (или один ключ):

 if ($hash.keys -notlike '*xampl*') {
    $hash.example = 1
}
  

Храните ключи в массиве для многократных проверок:

 $keys = $hash.keys
if ($keys -notlike '*xampl*') {
    $hash.example = 1
}
if ($keys -notlike '*foo*') {
    $hash.example = 1
}
  

Цепочка сравнений:

 if ($hash.keys -notlike '*xampl*' -notlike '*123*') {
    $hash.example = 1
}
  

Или используйте регулярное выражение, если ключей много, и вы хотите выполнить много проверок:

 if ($hash.keys -join "`n" -match '(?mi)xampl|foo|bar|^herpd |wDerp$|^and$|bsob|on') {
   echo 'Already present'
} else {
   $hash.foo123 = 'bar'
   # ......
}
  

(?mi) означает, что в конечном итоге чувствительный к регистру режим: каждый ключ проверяется индивидуально.