Давайте начнем снизу:
Get-ChildItem | where-object {$_.Name -contains 'Advanced'}
Get-ChildItem | where-object {$_.Name -contains '*adv*'}
Это не сработает, потому что -contains
является оператором сдерживания , а не a сравнение строк * оператор 1012 *.
-contains
ожидает некоторый набор (например, массив), а затем проверяет, правая ли операнд ('Advanced'
или '*adv*'
) присутствует в коллекции.
Если у вас есть скаляр (единственный объект, не являющийся коллекцией) в левой части -contains
, это эквивалентно -eq
- и, как вы обнаружили, -eq
также не дает желаемого результата.
Итак, почему не -eq
не работает?
Причина в том, что свойство Name
элементов в поставщике Registry
состоит из полного пути ключа . Подсистема форматирования PowerShell заботится об обрезке значения Name
при представлении в командной консоли, поэтому оно выглядит как , может быть просто Advanced
. Однако при прямом разрешении его значения открывается полное имя:
$AdvancedKey = Get-ChildItem | Where-Object {$_.Name -like '*advanced*'} |Select -First 1
$AdvancedKey.Name
# shows HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced
Как искать ключи реестра по точному имени?!
Не бойтесь! Поставщик Registry
присоединяет имя не-корневого ключа как скрытое свойство с именем PSChild
, которое можно использовать в последующих командах:
Get-ChildItem |Where-Object { $_.PSChildName -eq 'Advanced'}
Кроме того, командлеты поставщика также автоматически переводят аргумент имени для вас. так что вы могли бы просто сделать:
Get-Item Advanced
# or
Get-Item *adv*