【问题标题】:What is the PowerShell "Search" verb for?PowerShell“搜索”动词的用途是什么?
【发布时间】:2022-05-07 21:06:06
【问题描述】:

MSDN 页面“Approved Verbs for Windows PowerShell Commands”说:

Find 动词用于寻找对象。 Search 动词用于创建对容器中资源的引用。

“在容器中创建对资源的引用”是什么意思?这是否意味着为现有资源定义一个新名称?这是否意味着获取有关资源的一些信息并将该信息转换为参考?还是有别的意思?

如何使用“搜索”动词的示例是什么?这个动作和搜索有什么关系?

【问题讨论】:

  • 就此而言,GetFindSearchSelect 之间有什么区别?为什么是Get-Content 而不是Read-Content?为什么是Get-ChildItem 而不是Find-ChildItemSearch-ChildItem?这就是为什么我不喜欢批准的动词列表。好吧,事实上,当您必须输入 5-8 个字符才能到达唯一位时,它会使制表符补全的功能大大降低。
  • $(Locate-HumanReadableVerbExplanationFile).FullName | Find-MeaningOf -Verb Search
  • Locate-HumanReadableVerbExplanationFile : 术语“Locate-HumanReadableVerbExplanationFile”未被识别为 cmdlet、函数、脚本文件或可运行程序的名称。
  • 我想我可以回答为什么是Get-Content 而不是Read-Content。这只是推测,但我的理解是“获取”是用于获取对象的集合、整个对象或对象的整个内容,而“读取” " 用于从对象中获取一条信息。一个名为Read-Content 的命令可能只会为您提供项目内容的部分
  • @TannerSwett: @TannerSwett: 我认为GetRead 的区别不在于部分 信息,而在于检索对象本身 vs. 它的内容。因此,Get-Content,作为Get cmdlet 的通常 示例,可以说应该只称为Read,但Read 本身显然违反了动词-名词约定。 (Get-Content 的不寻常之处在于名词部分不指代目标实体类型;它基本上说“让我知道里面有什么”,没有命名 it;后者是 cmdlet通常会这样做,例如在Get-ADUser。)

标签: powershell


【解决方案1】:

tl;dr

  • SearchFind 之间的区别在 PowerShell 领域不明确

  • 现有的、源自 Microsoft 的模块反映了这种混淆,随意地带有 either Find-* Search-* cmdlet,但不是 两者。

  • 要解决此问题,请向 Microsoft 寻求说明,这可能会导致:

    • SearchFind 之间的一个有用区别需要解释,然后可以指导未来的实施。
    • 将一个动词声明为另一个动词的(遗留)同义词,并建议今后仅使用 one

人类语言是模棱两可的,这总是与 PowerShell 对一致性的值得称赞的追求不一致,如 Approved Verbs for Windows PowerShell Commands 中所述。

遗憾的是,该文档本身包含许多定义不明确的术语(在撰写本文时),模糊地互换使用,例如 resourceobjectitem、目标引用

有点讽刺的是,文件告诫:

要在 cmdlet 之间强制保持一致性,请勿使用已批准动词的同义词。

可以说,在英语中 findsearch 是同义词,只有对结果的确定程度区分它们:searchfind 更开放:您可以搜索没有结果,但找到意味着成功的结果。

在命名 cmdlet 时是否值得区分?

可以说不是,这反映在现实世界的 Microsoft 实现中 - 例如 Active Directory、Exchange 和 PowerShellGet 模块 - 选择一个术语来表示排除其他人

再次,有点讽刺的是,该文档似乎颠倒findsearch之间的人类语言关系:

  • Find

在容器中查找未知、隐含、可选或指定的对象。

  • Search

创建对容器中资源的引用。

抛开 objectcontainer 的歧义(以及在这种情况下 reference 是什么),它是 Find这里的定义听起来比 Search 更开放 - 与人类语言相反(英语)。


felixfbecker 对于Search-*Find-* cmdlet 的名词 部分遵守以下规定:

我认为另一个区别是Search-Noun中的名词描述搜索的内容 [搜索空格]Find-Noun 中的名词描述了正在搜索的内容 [种类的项目]。因此,例如,一个 cmdlet Search-Wikipedia 有意义,而 Find-Wikipedia 没有意义。另一方面,Find-WikipediaArticleSearch-Wikipedia-Article 都有意义,但含义不同。

这是一个有用的区别,但在实践中并未观察到,正如Search-ADAccount 的示例所示。 Vinny 指出,按照这种逻辑,名称应该是 Find-ADAccount,因为它看起来 帐户;或者,对于Search,它应该是Search-AD

【讨论】:

  • 关于 felixfbecker 观察的最后一点对我来说最有意义,尤其是在比较开箱即用的 Find-* cmdlet 与 Search-* cmdlet 时。 Search-ADAccount 搜索可能属于用户、计算机或服务帐户的 AD 帐户。它真的不知道它在寻找什么特定类型的对象,但它正在根据一个条件搜索整个 AD 帐户桶。
  • 虽然这会使 Search-ADAccount 出错。在这种情况下,Search-ADAccount 将in 查找 AD 帐户 for 属性,而不是查找帐户。如果我们要寻找一个帐户,命令不应该是 Find-ADAccount 吗?
  • 好点,@Vinny - 我已将您的观察添加到答案中:请在底部查看我的更新。
【解决方案2】:

我所知道的Search- 的唯一示例是Search-ADAccount,它确实对我们没有任何帮助,可以减少这种模糊性。它返回与Get-ADUser/Get-ADComputer/Get-ADObject 相同类型的对象,并且它具有Get- cmdlet 中不可用的搜索条件,即使它们也支持过滤和“搜索”。

【讨论】:

    【解决方案3】:

    一般来说,Get 命令用于检索信息以进行进一步处理,而Search 命令用于更轻松地排除未知数。

    如果我正在编写一个脚本,我可能想使用Get-AdUser 命令来获取信息,但是如果我不知道特定参数或按属性进行管道和排序的能力,我可能会找到它更容易拥有另一个带有通用制表符完成变量的命令行开关。

    Get-ADUser -Filter * -Properties LastLogonDate | ? {$_.LastLogonDate -lt (Get-Date).AddMonths(-3)}
    

    但是,要让 3 个月未登录的人获得一个相当长的命令..

    Search-ADAccount -AccountInactive
    

    用更少的输入做类似的工作,如果我只是将名称传递给 Csv,它们在功能上是相同的。

    显然,powershell 的设计者希望 Search 命令用作常见 Get 命令的简写版本,但它并没有真正流行起来,可能是因为像你我这样的普通人实际上对为什么有人有这些问题永远不会使用另一个。

    【讨论】:

    • 对于Search-ADAccount cmdlet,为什么“搜索”比“查找”更合适?
    【解决方案4】:

    答案就在你的问题中。

    Find 用于查找对象。但是,当涉及到诸如组、计算机、帐户之类的事情时。这些被称为“资源”。而且我们知道资源总是包含在容器中。因为它们在 Active Directory 中不作为对象存在。

    由于我们已经定义了“查找”来查找对象,我们需要另一个动词,因此我们可以在“容器”中“搜索”“资源”。

    下面是search-adaccount的说明:

    搜索-ADAAccount 获取 Active Directory 用户、计算机或服务帐户。

    【讨论】:

    • 听起来您是在说 Find 寻找“对象”,而 Search 寻找“资源”。那是对的吗?那么,“对象”和“资源”有什么区别呢? “对象”是指 .NET 对象吗?
    • 是的,查找查找“对象”,搜索查找“资源”。 Powershell 基于 .NET 框架构建。在幕后,所有对象都建立在 .NET 上,但是对象的“类型”在不同情况下可能不同。示例:powershell 中的进程是 .NET 类型的对象 - “System.Diagnostics.Process” 如果您想随时知道对象的“类型”,只需对其执行“Get-Member”即可。或者调用“getType()”方法。
    • 但是Search-ADAccount cmdlet 不会返回 Microsoft.ActiveDirectory.Management.ADAccount 类的对象,这与Get-Process cmdlet 返回 System.Diagnostics 类的对象的方式完全相同。过程?您是说 Active Directory 帐户是“资源”但进程不是?如果有,有什么区别?
    • 资源和对象在许多方面相似,但在其他方面完全相反。对象有行为但没有可见状态。它响应消息,传递更多对象。资源本身没有行为。他们只是裸露的状态。此外,cmdlet 的 o/p 始终是一个对象,因此您可以将其通过管道传送到另一个 cmdlet 以进行进一步处理。
    • 您需要更精确地了解对象和资源之间的区别。我要再问一次:在这种情况下,“对象”是指.NET 对象吗?您是说 Active Directory 帐户是资源但进程不是?
    【解决方案5】:

    什么是有意义的
    Find- cmdlet 查找 cmdlet 的名词:

    Find-Command 看起来 用于 命令

     
    Search- cmdlet 查看inside cmdlet 的名词:

    Search-Repository 可能看起来内部是各种项目的存储库。

    Search-ADForest 可能会在内部查看各种 AD 对象的 Active Directory 林。

     
    实际情况如何
    实际上,search 似乎被用作动词 find 的同义词。两者之间可能存在细微差别,但细微差别定义不明确。这不符合 Microsoft 自己的 cmdlet 名称动词用法指南,因此 search 应该被弃用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-03
      • 2023-03-11
      • 1970-01-01
      相关资源
      最近更新 更多