PowerShell,管道兼容 Select-字符串函数

PowerShell, pipeline compatible Select-String function

这更多是因为我对管道和功能的理解薄弱,所以希望得到帮助。例如:

Get-Service | Select-String win   # fails
Get-Service | Out-String -Stream | Select-String win   # works

我看过关于为什么需要 Out-String -Stream 的解释,但这让我有点沮丧,所以我想要一个函数 oss 来完成 Out-String -Stream 部分。我的想法是这样的:

function oss { Out-String -Stream }
Get-Service | oss | Select-String win

但这失败了。谁能告诉我如何进行这项工作,即使 oss 函数管道兼容?

然后,我们如何进行以下操作(显然这行不通,但我真的很好奇这将如何实现)?

function slx { Out-String -Stream | Select-String <and allow all of the same switches as Select-String> }
Get-Service | slx win

那么,实际上,slxSelect-String 的一个变体,它始终也是 Out-String -Stream 部分?

感谢你想学习,所以我不仅会给你一个可行的解决方案,还会解释一些事情。

看来您对函数和管道的工作原理有基本的了解。如果您想了解更多信息,请查看 about_Pipelines and about_Functions(以及相关的帮助主题),或者在评论中让我知道您特别想知道的内容。

如果您是 Powershell 新手,您需要了解的一件事是它是 object-based,而不是 text-based。它是通过管道传递的对象,您应该这样使用它们,而不是将它们转换为文本(除非用于文件输出)。

关于 Select-String states specifically, that it is meant for finding text in strings and files. But this is not what you are trying to do here. As I said, work with objects, not text. So omit the Out-String. The proper command to filter objects in a pipeline is Where-Object 或其别名之一 where? 的文档。

示例:

Get-Service | where { $_.DisplayName -like *win* }
# in newer Powershell versions, this shorter syntax is also possible:
Get-Service | where DisplayName -like *win*

但是正如您特别询问的关于制作“管道感知”功能的问题,这可以通过多种方式完成。但是您的问题不仅在于从管道获取输入,还在于您将其传递给 Out-String 的方式,因为如果您一次只传递一项,输出将会改变。

基本上你必须一次传递所有的输入。因此,在您的情况下实现此目的的最简单方法是使用 $Input 自动变量:

 function oss { $Input | Out-String -Stream }

如果您需要一次处理一个管道项,则有更多方法可以获取管道输入。例如 advanced function:

function example { 
    process {
        $_ # current item
    }
}

您还可以使用 parameter attribute 将管道输入绑定到函数参数:

function example {
    param(
        [Parameter(ValueFromPipeline = $true)]
        $InputObject
    )
    process {
        $InputObject # current item
    }
}

我能想到的最后一种方法是使用 filter,这是一种特殊的函数,专门设计用于对每个管道元素执行操作:

filter example {
    $_ # current item
}

要了解更多信息,我建议进行 google 搜索,这将快速为您提供有用的文章,例如 Build a PowerShell function for the pipeline or Incorporating Pipelined Input into PowerShell Functions

如果你真的想构建一个基本上是另一个 cmdlet 的包装器的方法,比如 Out-StringSelect-String 具有所有相同的开关,你应该看看 proxy functions .但我认为这对于您正在尝试做的事情来说太过分了:

function oss {
    [CmdletBinding()]
    param(
        [Parameter(ValueFromPipeline = $true)]
        [psobject]$InputObject
    )
    begin
    {
        try {
            $outBuffer = $null
            if ($PSBoundParameters.TryGetValue('OutBuffer', [ref]$outBuffer))
            {
                $PSBoundParameters['OutBuffer'] = 1
            }
            # set -Stream switch always
            $PSBoundParameters["Stream"] = $true
            $wrappedCmd = $ExecutionContext.InvokeCommand.GetCommand('Microsoft.PowerShell.Utility\Out-String', [System.Management.Automation.CommandTypes]::Cmdlet)
            $scriptCmd = {& $wrappedCmd @PSBoundParameters }
            $steppablePipeline = $scriptCmd.GetSteppablePipeline($myInvocation.CommandOrigin)
            $steppablePipeline.Begin($PSCmdlet)
        } catch {
            throw
        }
    }
    process
    {
        try {
            $steppablePipeline.Process($_)
        } catch {
            throw
        }
    }
    end
    {
        try {
            $steppablePipeline.End()
        } catch {
            throw
        }
    }
}

注:此回答补充.


Windows PowerShell v5.1 和 PowerShell [Core] v6+ 有一个 oss 函数内置 ,它通过代理函数有效地提供了 Out-String -Stream 的功能,如@marsze 的回答所示。

  • 顺便说一句:从 PowerShell 7.1 开始,当您构建代理函数时 auto-generated 的代码存在一些小缺陷;简而言之:OutBuffer相关代码仅适用于需要防范DoS(denial-of-service)攻击的server-side代理功能,throw语句应为$PSCmdlet.ThrowTerminatingError($_) 而不是 - 请参阅 GitHub issue #10863.

虽然此辅助函数很有用,但一开始就不需要它,因为Select-String 应该隐式操作格式化输出开始于:

  • 也就是说,对于还不是字符串(文本)的输入,Select-String 应该搜索您在 控制台中看到的相同格式的文本表示(终端)。

    • 注意:正如 marsze 的回答中指出的,在 programmatic use 中,为了健壮性,您应该利用 PowerShell 的 object-oriented 性质和查询 properties 改为 Where-Object.
      但是,for quick-and-dirtyinteractive使用它可以很方便的通过for-display表示.[=106=进行搜索]
  • GitHub suggestion #10726 只是提出了这一点,尽管似乎存在 backward-compatibility 担忧,尽管我认为不应该存在。


您可以根据 marsze 的答案调整 proxy-function 方法,以正确实现您设想的 slx 函数,作为 高级函数 Select-StringFormatted,别名为 [=23] =](参见下面的原理;当然,您也可以定义slx)。

注:

  • 大部分代码是 auto-generated 对 Select-String 支持的相同参数的声明;通过 Out-String -Stream 的实际代理(包装)代码很少。

  • 别名 scsSelect-String 的 built-in 别名 sls 应该是 ,鉴于 approved verb Select 的官方别名前缀是 sc,而不是 ls;在 PowerShell [Core] v6+ 中,您可以使用 Get-Verb Select 轻松验证这一点。由于隐含的 Out-String -Stream 行为应该是 Select-String 的默认行为,我认为选择这个别名是有意义的; if/when Select-String 得到修复,您可以重新定义 scs 指向 Select-String.

  • 声明了 v7.0 支持的所有参数;如果您尝试使用仅在早期版本的 7.0 中引入的那些,即 -Culture-Raw-NoEmphasis,它们将被忽略并发出警告。

  • 示例命令(与 Get-Process | sls service 的输出比较):

    PS> Get-Process | scs service  # scs == Select-StringFormatted
    
        395      16     3728      14656              5664   0 SecurityHealthService                                                                                
        360      11     3864       7696               632   0 services                                                                                             
        173      12     3324       8628              2388   0 VGAuthService                                                                                        
    

注意:下面的功能也可以作为an MIT-licensed Gist使用,以后只会维护后者。假设您已查看链接代码以确保它是安全的(我个人可以向您保证,但您应该始终检查),您可以按如下方式安装它:

irm https://gist.github.com/mklement0/46fea9e6e5ef1a3ceaf681c976cb68e3/raw/Select-StringFormatted.ps1 | iex
Set-Alias scs Select-StringFormatted

function Select-StringFormatted {
  <#
    .SYNOPSIS
    Select-String wrapper command that for non-string input searches the
    *formatted* object representations rather than the often useless
    .ToString() representations.

    All Select-String parameters are supported. See the latter's help for more.

    .EXAMPLE
    Get-Process | Select-StringFormatted pwsh

    Output lines that contain "pwsh" in Get-Process' formatted output.

    .LINK
    Select-String

    #>
  [CmdletBinding(DefaultParameterSetName = 'File', HelpUri = 'https://go.microsoft.com/fwlink/?LinkID=2097119')]
  param(
    [ValidateSet('Ordinal', 'Invariant', 'Current', '', 'af', 'af-NA', 'af-ZA', 'agq', 'agq-CM', 'ak', 'ak-GH', 'am', 'am-ET', 'ar', 'ar-001', 'ar-AE', 'ar-BH', 'ar-DJ', 'ar-DZ', 'ar-EG', 'ar-EH', 'ar-ER', 'ar-IL', 'ar-IQ', 'ar-JO', 'ar-KM', 'ar-KW', 'ar-LB', 'ar-LY', 'ar-MA', 'ar-MR', 'ar-OM', 'ar-PS', 'ar-QA', 'ar-SA', 'ar-SD', 'ar-SO', 'ar-SS', 'ar-SY', 'ar-TD', 'ar-TN', 'ar-YE', 'arn', 'arn-CL', 'as', 'as-IN', 'asa', 'asa-TZ', 'ast', 'ast-ES', 'az', 'az-Cyrl', 'az-Cyrl-AZ', 'az-Latn', 'az-Latn-AZ', 'ba', 'ba-RU', 'bas', 'bas-CM', 'be', 'be-BY', 'bem', 'bem-ZM', 'bez', 'bez-TZ', 'bg', 'bg-BG', 'bm', 'bm-ML', 'bn', 'bn-BD', 'bn-IN', 'bo', 'bo-CN', 'bo-IN', 'br', 'br-FR', 'brx', 'brx-IN', 'bs', 'bs-Cyrl', 'bs-Cyrl-BA', 'bs-Latn', 'bs-Latn-BA', 'byn', 'byn-ER', 'ca', 'ca-AD', 'ca-ES', 'ca-FR', 'ca-IT', 'ccp', 'ccp-BD', 'ccp-IN', 'ce', 'ce-RU', 'ceb', 'ceb-PH', 'cgg', 'cgg-UG', 'chr', 'chr-US', 'ckb', 'ckb-IQ', 'ckb-IR', 'co', 'co-FR', 'cs', 'cs-CZ', 'cv', 'cv-RU', 'cy', 'cy-GB', 'da', 'da-DK', 'da-GL', 'dav', 'dav-KE', 'de', 'de-AT', 'de-BE', 'de-CH', 'de-DE', 'de-IT', 'de-LI', 'de-LU', 'dje', 'dje-NE', 'dsb', 'dsb-DE', 'dua', 'dua-CM', 'dv', 'dv-MV', 'dyo', 'dyo-SN', 'dz', 'dz-BT', 'ebu', 'ebu-KE', 'ee', 'ee-GH', 'ee-TG', 'el', 'el-CY', 'el-GR', 'en', 'en-001', 'en-150', 'en-AD', 'en-AE', 'en-AG', 'en-AI', 'en-AL', 'en-AR', 'en-AS', 'en-AT', 'en-AU', 'en-BA', 'en-BB', 'en-BD', 'en-BE', 'en-BG', 'en-BI', 'en-BM', 'en-BR', 'en-BS', 'en-BW', 'en-BZ', 'en-CA', 'en-CC', 'en-CH', 'en-CK', 'en-CL', 'en-CM', 'en-CN', 'en-CO', 'en-CX', 'en-CY', 'en-CZ', 'en-DE', 'en-DG', 'en-DK', 'en-DM', 'en-EE', 'en-ER', 'en-ES', 'en-FI', 'en-FJ', 'en-FK', 'en-FM', 'en-FR', 'en-GB', 'en-GD', 'en-GG', 'en-GH', 'en-GI', 'en-GM', 'en-GR', 'en-GU', 'en-GY', 'en-HK', 'en-HR', 'en-HU', 'en-ID', 'en-IE', 'en-IL', 'en-IM', 'en-IN', 'en-IO', 'en-IS', 'en-IT', 'en-JE', 'en-JM', 'en-JP', 'en-KE', 'en-KI', 'en-KN', 'en-KR', 'en-KY', 'en-LC', 'en-LR', 'en-LS', 'en-LT', 'en-LU', 'en-LV', 'en-ME', 'en-MG', 'en-MH', 'en-MM', 'en-MO', 'en-MP', 'en-MS', 'en-MT', 'en-MU', 'en-MV', 'en-MW', 'en-MX', 'en-MY', 'en-NA', 'en-NF', 'en-NG', 'en-NL', 'en-NO', 'en-NR', 'en-NU', 'en-NZ', 'en-PG', 'en-PH', 'en-PK', 'en-PL', 'en-PN', 'en-PR', 'en-PT', 'en-PW', 'en-RO', 'en-RS', 'en-RU', 'en-RW', 'en-SA', 'en-SB', 'en-SC', 'en-SD', 'en-SE', 'en-SG', 'en-SH', 'en-SI', 'en-SK', 'en-SL', 'en-SS', 'en-SX', 'en-SZ', 'en-TC', 'en-TH', 'en-TK', 'en-TO', 'en-TR', 'en-TT', 'en-TV', 'en-TW', 'en-TZ', 'en-UA', 'en-UG', 'en-UM', 'en-US', 'en-US-POSIX', 'en-VC', 'en-VG', 'en-VI', 'en-VU', 'en-WS', 'en-ZA', 'en-ZM', 'en-ZW', 'eo', 'eo-001', 'es', 'es-419', 'es-AG', 'es-AI', 'es-AR', 'es-AW', 'es-BB', 'es-BL', 'es-BM', 'es-BO', 'es-BQ', 'es-BR', 'es-BS', 'es-BZ', 'es-CA', 'es-CL', 'es-CO', 'es-CR', 'es-CU', 'es-CW', 'es-DM', 'es-DO', 'es-EA', 'es-EC', 'es-ES', 'es-FK', 'es-GD', 'es-GF', 'es-GL', 'es-GP', 'es-GQ', 'es-GT', 'es-GY', 'es-HN', 'es-HT', 'es-IC', 'es-KN', 'es-KY', 'es-LC', 'es-MF', 'es-MQ', 'es-MS', 'es-MX', 'es-NI', 'es-PA', 'es-PE', 'es-PH', 'es-PM', 'es-PR', 'es-PY', 'es-SR', 'es-SV', 'es-SX', 'es-TC', 'es-TT', 'es-US', 'es-UY', 'es-VC', 'es-VE', 'es-VG', 'es-VI', 'et', 'et-EE', 'eu', 'eu-ES', 'ewo', 'ewo-CM', 'fa', 'fa-AF', 'fa-IR', 'ff', 'ff-Latn', 'ff-Latn-BF', 'ff-Latn-CM', 'ff-Latn-GH', 'ff-Latn-GM', 'ff-Latn-GN', 'ff-Latn-GW', 'ff-Latn-LR', 'ff-Latn-MR', 'ff-Latn-NE', 'ff-Latn-NG', 'ff-Latn-SL', 'ff-Latn-SN', 'fi', 'fi-FI', 'fil', 'fil-PH', 'fo', 'fo-DK', 'fo-FO', 'fr', 'fr-BE', 'fr-BF', 'fr-BI', 'fr-BJ', 'fr-BL', 'fr-CA', 'fr-CD', 'fr-CF', 'fr-CG', 'fr-CH', 'fr-CI', 'fr-CM', 'fr-DJ', 'fr-DZ', 'fr-FR', 'fr-GA', 'fr-GF', 'fr-GN', 'fr-GP', 'fr-GQ', 'fr-HT', 'fr-KM', 'fr-LU', 'fr-MA', 'fr-MC', 'fr-MF', 'fr-MG', 'fr-ML', 'fr-MQ', 'fr-MR', 'fr-MU', 'fr-NC', 'fr-NE', 'fr-PF', 'fr-PM', 'fr-RE', 'fr-RW', 'fr-SC', 'fr-SN', 'fr-SY', 'fr-TD', 'fr-TG', 'fr-TN', 'fr-VU', 'fr-WF', 'fr-YT', 'fur', 'fur-IT', 'fy', 'fy-NL', 'ga', 'ga-IE', 'gaa', 'gaa-GH', 'gd', 'gd-GB', 'gez', 'gez-ER', 'gez-ET', 'gl', 'gl-ES', 'gn', 'gn-PY', 'gsw', 'gsw-CH', 'gsw-FR', 'gsw-LI', 'gu', 'gu-IN', 'guz', 'guz-KE', 'gv', 'gv-IM', 'ha', 'ha-GH', 'ha-NE', 'ha-NG', 'haw', 'haw-US', 'he', 'he-IL', 'hi', 'hi-IN', 'hi-Latn', 'hr', 'hr-BA', 'hr-HR', 'hsb', 'hsb-DE', 'hu', 'hu-HU', 'hy', 'hy-AM', 'ia', 'ia-001', 'id', 'id-ID', 'ig', 'ig-NG', 'ii', 'ii-CN', 'io', 'io-001', 'is', 'is-IS', 'it', 'it-CH', 'it-IT', 'it-SM', 'it-VA', 'iu', 'iu-CA', 'ja', 'ja-JP', 'jbo', 'jbo-001', 'jgo', 'jgo-CM', 'jmc', 'jmc-TZ', 'jv', 'jv-ID', 'ka', 'ka-GE', 'kab', 'kab-DZ', 'kaj', 'kaj-NG', 'kam', 'kam-KE', 'kcg', 'kcg-NG', 'kde', 'kde-TZ', 'kea', 'kea-CV', 'khq', 'khq-ML', 'ki', 'ki-KE', 'kk', 'kk-KZ', 'kkj', 'kkj-CM', 'kl', 'kl-GL', 'kln', 'kln-KE', 'km', 'km-KH', 'kn', 'kn-IN', 'ko', 'ko-KP', 'ko-KR', 'kok', 'kok-IN', 'kpe', 'kpe-GN', 'kpe-LR', 'ks', 'ks-Arab', 'ks-Arab-IN', 'ks-Aran', 'ks-Aran-IN', 'ks-Deva', 'ks-IN', 'ksb', 'ksb-TZ', 'ksf', 'ksf-CM', 'ksh', 'ksh-DE', 'ku', 'ku-TR', 'kw', 'kw-GB', 'ky', 'ky-KG', 'lag', 'lag-TZ', 'lb', 'lb-LU', 'lg', 'lg-UG', 'lkt', 'lkt-US', 'ln', 'ln-AO', 'ln-CD', 'ln-CF', 'ln-CG', 'lo', 'lo-LA', 'lrc', 'lrc-IQ', 'lrc-IR', 'lt', 'lt-LT', 'lu', 'lu-CD', 'luo', 'luo-KE', 'luy', 'luy-KE', 'lv', 'lv-LV', 'mas', 'mas-KE', 'mas-TZ', 'mer', 'mer-KE', 'mfe', 'mfe-MU', 'mg', 'mg-MG', 'mgh', 'mgh-MZ', 'mgo', 'mgo-CM', 'mi', 'mi-NZ', 'mk', 'mk-MK', 'ml', 'ml-IN', 'mn', 'mn-MN', 'mni', 'mni-Beng', 'mni-Beng-IN', 'mni-Mtei', 'mni-Mtei-IN', 'moh', 'moh-CA', 'mr', 'mr-IN', 'ms', 'ms-Arab', 'ms-Arab-BN', 'ms-Arab-MY', 'ms-BN', 'ms-MY', 'ms-SG', 'mt', 'mt-MT', 'mua', 'mua-CM', 'my', 'my-MM', 'myv', 'myv-RU', 'mzn', 'mzn-IR', 'naq', 'naq-NA', 'nb', 'nb-NO', 'nb-SJ', 'nd', 'nd-ZW', 'nds', 'nds-DE', 'nds-NL', 'ne', 'ne-IN', 'ne-NP', 'nl', 'nl-AW', 'nl-BE', 'nl-BQ', 'nl-CW', 'nl-NL', 'nl-SR', 'nl-SX', 'nmg', 'nmg-CM', 'nn', 'nn-NO', 'nnh', 'nnh-CM', 'nqo', 'nqo-GN', 'nr', 'nr-ZA', 'nso', 'nso-ZA', 'nus', 'nus-SS', 'ny', 'ny-MW', 'nyn', 'nyn-UG', 'oc', 'oc-FR', 'om', 'om-ET', 'om-KE', 'or', 'or-IN', 'os', 'os-GE', 'os-RU', 'pa', 'pa-Arab', 'pa-Arab-PK', 'pa-Aran', 'pa-Aran-PK', 'pa-Guru', 'pa-Guru-IN', 'pl', 'pl-PL', 'ps', 'ps-AF', 'ps-PK', 'pt', 'pt-AO', 'pt-BR', 'pt-CH', 'pt-CV', 'pt-FR', 'pt-GQ', 'pt-GW', 'pt-LU', 'pt-MO', 'pt-MZ', 'pt-PT', 'pt-ST', 'pt-TL', 'qu', 'qu-BO', 'qu-EC', 'qu-PE', 'rm', 'rm-CH', 'rn', 'rn-BI', 'ro', 'ro-MD', 'ro-RO', 'rof', 'rof-TZ', 'ru', 'ru-BY', 'ru-KG', 'ru-KZ', 'ru-MD', 'ru-RU', 'ru-UA', 'rw', 'rw-RW', 'rwk', 'rwk-TZ', 'sa', 'sa-IN', 'sah', 'sah-RU', 'saq', 'saq-KE', 'sat', 'sat-Deva', 'sat-Deva-IN', 'sat-Olck', 'sat-Olck-IN', 'sbp', 'sbp-TZ', 'sc', 'sc-IT', 'scn', 'scn-IT', 'sd', 'sd-Deva', 'sd-PK', 'se', 'se-FI', 'se-NO', 'se-SE', 'seh', 'seh-MZ', 'ses', 'ses-ML', 'sg', 'sg-CF', 'shi', 'shi-Latn', 'shi-Latn-MA', 'shi-Tfng', 'shi-Tfng-MA', 'si', 'si-LK', 'sk', 'sk-SK', 'sl', 'sl-SI', 'smn', 'smn-FI', 'sn', 'sn-ZW', 'so', 'so-DJ', 'so-ET', 'so-KE', 'so-SO', 'sq', 'sq-AL', 'sq-MK', 'sq-XK', 'sr', 'sr-Cyrl', 'sr-Cyrl-BA', 'sr-Cyrl-ME', 'sr-Cyrl-RS', 'sr-Cyrl-XK', 'sr-Latn', 'sr-Latn-BA', 'sr-Latn-ME', 'sr-Latn-RS', 'sr-Latn-XK', 'ss', 'ss-SZ', 'ss-ZA', 'st', 'st-LS', 'st-ZA', 'sv', 'sv-AX', 'sv-FI', 'sv-SE', 'sw', 'sw-CD', 'sw-KE', 'sw-TZ', 'sw-UG', 'syr', 'syr-IQ', 'syr-SY', 'ta', 'ta-IN', 'ta-LK', 'ta-MY', 'ta-SG', 'te', 'te-IN', 'teo', 'teo-KE', 'teo-UG', 'tg', 'tg-TJ', 'th', 'th-TH', 'ti', 'ti-ER', 'ti-ET', 'tig', 'tig-ER', 'tk', 'tk-TM', 'tn', 'tn-BW', 'tn-ZA', 'to', 'to-TO', 'tr', 'tr-CY', 'tr-TR', 'trv', 'trv-TW', 'ts', 'ts-ZA', 'tt', 'tt-RU', 'twq', 'twq-NE', 'tzm', 'tzm-MA', 'ug', 'ug-CN', 'uk', 'uk-UA', 'ur', 'ur-Arab', 'ur-Arab-IN', 'ur-Arab-PK', 'ur-Aran', 'ur-Aran-IN', 'ur-Aran-PK', 'ur-IN', 'ur-PK', 'uz', 'uz-Arab', 'uz-Arab-AF', 'uz-Cyrl', 'uz-Cyrl-UZ', 'uz-Latn', 'uz-Latn-UZ', 'vai', 'vai-Latn', 'vai-Latn-LR', 'vai-Vaii', 'vai-Vaii-LR', 've', 've-ZA', 'vi', 'vi-VN', 'vun', 'vun-TZ', 'wa', 'wa-BE', 'wae', 'wae-CH', 'wal', 'wal-ET', 'wo', 'wo-SN', 'wuu', 'xh', 'xh-ZA', 'xog', 'xog-UG', 'yav', 'yav-CM', 'yi', 'yi-001', 'yo', 'yo-BJ', 'yo-NG', 'yue', 'yue-Hans', 'yue-Hans-CN', 'yue-Hant', 'yue-Hant-HK', 'zgh', 'zgh-MA', 'zh', 'zh-Hans', 'zh-Hans-CN', 'zh-Hans-HK', 'zh-Hans-MO', 'zh-Hans-SG', 'zh-Hant', 'zh-Hant-CN', 'zh-Hant-HK', 'zh-Hant-MO', 'zh-Hant-TW', 'zu', 'zu-ZA')]
    [ValidateNotNull()]
    [string]
    ${Culture},
    
    [Parameter(ParameterSetName = 'ObjectRaw', Mandatory, ValueFromPipeline)]
    [Parameter(ParameterSetName = 'Object', Mandatory, ValueFromPipeline)]
    [AllowEmptyString()]
    [AllowNull()]
    [psobject]
    ${InputObject},
    
    [Parameter(Mandatory, Position = 0)]
    [string[]]
    ${Pattern},
    
    [Parameter(ParameterSetName = 'FileRaw', Mandatory, Position = 1, ValueFromPipelineByPropertyName)]
    [Parameter(ParameterSetName = 'File', Mandatory, Position = 1, ValueFromPipelineByPropertyName)]
    [string[]]
    ${Path},
    
    [Parameter(ParameterSetName = 'LiteralFileRaw', Mandatory, ValueFromPipelineByPropertyName)]
    [Parameter(ParameterSetName = 'LiteralFile', Mandatory, ValueFromPipelineByPropertyName)]
    [Alias('PSPath', 'LP')]
    [string[]]
    ${LiteralPath},
    
    [Parameter(ParameterSetName = 'LiteralFileRaw', Mandatory)]
    [Parameter(ParameterSetName = 'FileRaw', Mandatory)]
    [Parameter(ParameterSetName = 'ObjectRaw', Mandatory)]
    [switch]
    ${Raw},
    
    [switch]
    ${SimpleMatch},
    
    [switch]
    ${CaseSensitive},
    
    [Parameter(ParameterSetName = 'File')]
    [Parameter(ParameterSetName = 'Object')]
    [Parameter(ParameterSetName = 'LiteralFile')]
    [switch]
    ${Quiet},
    
    [switch]
    ${List},
    
    [switch]
    ${NoEmphasis},
    
    [ValidateNotNullOrEmpty()]
    [string[]]
    ${Include},
    
    [ValidateNotNullOrEmpty()]
    [string[]]
    ${Exclude},
    
    [switch]
    ${NotMatch},
    
    [switch]
    ${AllMatches},
    
    [ValidateNotNullOrEmpty()]
    [System.Text.Encoding]
    ${Encoding},
    
    [ValidateRange(0, 2147483647)]
    [ValidateNotNullOrEmpty()]
    [ValidateCount(1, 2)]
    [int[]]
    ${Context})
    
  begin {
    # Ignore parameters that are only supported in v7+
    if ($PSVersionTable.PSVersion.Major -lt 7) {
      ('Culture', 'Raw', 'NoEmphasis').ForEach( {
          if ($PSBoundParameters.ContainsKey($_)) {
            $null = $PSBoundParameters.Remove($_)
            Write-Warning "Ignoring parameter $_, because it is only supported in PowerShell 7.0 or above."
          }
        })
    }
    # Set up the steppable pipeline.
    try {
      $commandToWrap = { Out-String -Stream | Select-String @PSBoundParameters }
      $steppablePipeline = $commandToWrap.GetSteppablePipeline($myInvocation.CommandOrigin)
      $steppablePipeline.Begin($PSCmdlet)
    }
    catch {
      $PSCmdlet.ThrowTerminatingError($_)
    }
  }
    
  process {
    $steppablePipeline.Process($_)
  }
    
  end {
    $steppablePipeline.End()
  }
    
}

这经常出现。其他选项。在get-service的情况下,-name和-displayname都带通配符:

get-service *win*
get-service -displayname *win*

或者如果通配符不可用,但您需要知道 属性 名称,通常是列标题,在本例中为显示名称:

get-service | where displayname -match win

有时这样的事情会得到一些结果。这取决于 object 的字符串版本变为:

get-service | where { $_ -match 'win' } 

有时将所有内容转换为字符串并进行搜索很有用。我不介意这样做。 "/i" 不区分大小写。

get-service | findstr /i win