Что такое глагол "Поиск" для PowerShell?
Страница MSDN "Утвержденные глаголы для команд Windows PowerShell" говорит:
Глагол Найти используется для поиска объекта. Глагол Поиск используется для создания ссылки на ресурс в контейнере.
Что означает "создать ссылку на ресурс в контейнере"? Это означает определение нового имени для существующего ресурса? Означает ли это получение некоторой информации о ресурсе и преобразование этой информации в ссылку? Или это значит что-то еще?
Какой пример использования глагола "Поиск"? И что это действие связано с поиском?
Ответы
Ответ 1
ТЛ; др
Различие между Search
и Find
плохо определено в сфере PowerShell.
Существующие модули, созданные Microsoft, отражают эту путаницу, произвольно поступая с командлетами Find-*
или Search-*
, но не с обоими.
Чтобы решить эту проблему, попросите у Microsoft разъяснения, которые могут привести к одному из следующих вариантов:
- полезное различие между
Search
и Find
, которое необходимо объяснить и которое затем может служить ориентиром для будущих реализаций.
- или объявив один глагол (унаследованным) синонимом другого, и сделав рекомендацию использовать только один глагол в будущем.
Человеческий язык неоднозначен, что неизменно расходится с похвальным стремлением PowerShell к обеспечению согласованности, как описано в Одобренных глаголах для команд Windows PowerShell.
К сожалению, сам этот документ содержит много плохо определенных терминов (на момент написания), которые используются неопределенно взаимозаменяемо, таких как ресурс, объект, элемент, цель и ссылка.
Как ни странно, документ убеждает:
Для обеспечения согласованности командлетов не используйте синоним утвержденного глагола.
Можно утверждать, что на английском языке поиск и поиск синонимов ARE возможны только при определенной степени уверенности в том, что результат различает их: поиск более открытый, чем поиск: вы можете искать без результата, но находить подразумевает положительный результат.
Стоит ли делать это различие, когда дело доходит до именования командлетов?
Возможно, это не, что отражается в реальных реализациях Microsoft, таких как модули Active Directory, Exchange и PowerShellGet, - выбирая один термин, исключая другой.
Опять же, по иронии судьбы, указанный документ, похоже, меняет отношения между людьми и поиском на язык:
Find
Ищет объект в контейнере, который является неизвестным, подразумеваемым, необязательным или заданным.
Search
Создает ссылку на ресурс в контейнере.
Оставляя в стороне неоднозначность вокруг объекта и контейнера (и какова ссылка в этом контексте), это определение Find
здесь звучит более открыто, чем Search
- в противоположность человеческому языку (английскому).
felixfbecker отмечает следующее в отношении существительной части командлетов Search-*
и Find-*
:
Я думаю, что другое отличие состоит в том, что существительное в Search-Noun
описывает то, что ищется, в то время как существительное в Find-Noun
описывает то, что ищется. Поэтому, например, командлет Search-Wikipedia
имеет смысл, а Find-Wikipedia
- нет. Find-WikipediaArticle
и Search-Wikipedia-Article
, с другой стороны, оба имеют смысл, но означают разные вещи.
Ответ 2
Единственным примером Search-
, о котором я знаю, является Search-ADAccount
, и это действительно не делает нам никаких преимуществ в плане того, чтобы сделать это менее двусмысленным. Он возвращает тот же тип объекта, что и Get-ADUser
/Get-ADComputer
/Get-ADObject
, и имеет критерии поиска, которые недоступны в командлетах Get-
, даже если они поддерживают фильтрацию и "поиск".
Ответ 3
Вообще говоря, команды Get
используются для извлечения информации для дальнейшей обработки, если используются команды Search
, чтобы упростить сортировку неизвестных.
Если бы я писал script, я бы предпочел использовать команду Get-AdUser
для получения информации, однако, если бы я не был уверен в конкретных параметрах или возможности передавать и сортировать по свойству, я могу легче найти другой командный файл с общими переменными, заполненными табуляцией.
Get-ADUser -Filter * -Properties LastLogonDate | ? {$_.LastLogonDate -lt (Get-Date).AddMonths(-3)}
- довольно длинная команда, чтобы получить людей, которые не вошли в систему в течение 3 месяцев, однако..
Search-ADAccount -AccountInactive
выполняет аналогичную работу с гораздо меньшим количеством входных данных, и если я просто пишу имена на Csv, они функционально идентичны.
очевидно, что разработчики powershell ожидали, что команды Search
будут использоваться в виде сокращенных версий общих команд Get
, однако на самом деле это не сильно улавливается, возможно, потому, что нормальные люди, такие как вы и я, на самом деле имеют эти вопросы относительно того, почему кто-то когда-либо использовали один над другим.
Ответ 4
Ответ на ваш вопрос.
Найти используется для поиска объектов. Однако, когда дело доходит до таких вещей, как - Группы, компьютеры, учетная запись. Они называются "ресурсами". И мы знаем, что ресурсы всегда содержатся внутри контейнера. Поскольку они не существуют как объекты в Active Directory.
Поскольку мы уже определили "Найти" для поиска объекта, нам нужен еще один глагол, поэтому мы можем "искать" для "ресурсов" внутри "контейнера".
Ниже приведено описание search-adaccount:
Поиск-ADAccount
Получает учетные записи пользователей, компьютеров или служб Active Directory.