Почему powershell не может найти этот предмет? - PullRequest
1 голос
/ 27 марта 2020

С помощью этой команды Get-ChildItem | where-object {$_.Name -like '*advanced*'} оболочка может найти элемент.



    Hive: HKEY_CURRENT_USER\software\Microsoft\Windows\CurrentVersion\explorer


Name                           Property
----                           --------
Advanced                       Start_SearchFiles   : 2
                               ServerAdminUI       : 0
                               Hidden              : 2
...continues...

Но если я попробую любой другой вариант

Get-ChildItem | where-object {$_.Name -eq 'Advanced'}
Get-ChildItem | where-object {$_.Name -contains 'Advanced'}
Get-ChildItem | where-object {$_.Name -contains '*adv*'}

Они все окажутся пустыми. Насколько я могу сказать, он должен получить тот же результат, нет?

1 Ответ

2 голосов
/ 27 марта 2020

Давайте начнем снизу:

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*
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...