PowerShell,支持管道的Select-String函数

5

这更多是关于我对管道和函数的理解薄弱,因此希望得到帮助。以一个例子为例:

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部分吗?

4
过滤服务不是应该像这样执行吗:get-service | where { $_.DisplayName -Match 'win' }(查找所有包含“win”的服务)? - Luuk
2
你尝试过 get-Service -name "win*" 吗?这种方式避免了使用管道,但并没有解决你问题的核心。 - Walter Mitty
谢谢。你们两个当然是对的,但这并不是我想要实现的。正如我所说的,这只是一个例子,因为我正在尝试理解如何更好地操作管道以构建具有管道感知能力的函数。也就是说,在面对这种情况时,我该如何构建这两种形式的管道感知函数:a)模仿类似于 Out-String -Stream 的东西;b)在特定方式下扩展 Select-String 的功能。 - YorSubs
@YorSubs - 看看高级函数。**你需要定义一个参数并告诉它接受管道输入**。 - Lee_Dailey
3个回答

6

我很欣赏你想学习,因此我不仅会给你提供一个可行的解决方案,还会解释一些事情。

看起来你已经基本了解函数和管道的工作原理。如果你想了解更多,请查看关于管道关于函数(以及相关帮助主题),或在评论中告诉我你特别想知道什么。

但是,如果你是Powershell的新手,需要明白的一件事是,它是基于对象的,而不是基于文本的。通过管道传递的是对象,你应该按照这样的方式处理它们,而不是将它们转换为文本(除非是用于文件输出)。

关于 Select-String 的文档明确说明,它是用于在字符串和文件中查找文本的。但这不是你在这里要做的事情。正如我所说,要使用对象而不是文本。因此省略 Out-String。在管道中过滤对象的正确命令是 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*

但是,由于你特别询问了如何使函数“pipeline aware”,这可以通过多种方式实现。但是你的问题不仅涉及从管道获取输入,还包括将其传递给Out-String的方式,因为如果一次只传递一个项目,则输出将会发生变化。

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

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

如果您需要逐个处理管道项,则有更多获取管道输入的方法。例如,使用高级函数
function example { 
    process {
        $_ # current item
    }
}

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

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

我能想到的最后一种方法是使用过滤器,它是一种特殊类型的函数,专门设计用于对每个管道元素执行操作:
filter example {
    $_ # current item
}

如果想了解更多,我建议您进行谷歌搜索,这将快速为您提供有用的文章,例如构建一个用于管道的PowerShell函数将管道输入纳入PowerShell函数

如果您真的想构建一个基本上是另一个cmdlet(如Out-StringSelect-String)的包装器方法,并具有相同的开关,您应该看一下代理函数。但我认为这对您尝试做的事情来说有点过度设计:

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
        }
    }
}

非常迷人,非常感謝@marsze。我已經使用PowerShell很長一段時間了,但這個領域一直是我的一個大問號,我不知道如何實現這些事情。我曾幾次查看高級功能類型頁面,但始終覺得它們有點深奧和困惑。這些都是很好的例子,我可以真正投入其中(總是發現通過具體任務學習更好)。我還有一些工作要做,才能正確地進行這些操作……真的非常感謝! - YorSubs
@YorSubs 不用谢。我建议你总是先自己做一些研究。但是每当你遇到困难时,随时可以问更多的问题。这里有很多人提供优秀的答案。 - marsze
1
做得好!顺便一提:代理函数自动生成的代码存在一些小缺陷,请参见 https://github.com/PowerShell/PowerShell/issues/1086。我认为在这里删除代码中的输出缓冲部分是有意义的。 - mklement0

2
注意:本答案是对marsze的有益回答补充
Windows PowerShell v5.1和PowerShell [Core] v6+内置了一个名为oss的函数,通过代理函数有效地提供了Out-String -Stream的功能,如@marsze的回答所示。
另外:当你构建代理函数时自动生成的代码在PowerShell 7.1中有一些小缺陷;简而言之:OutBuffer相关的代码仅适用于需要防范DoS(拒绝服务)攻击的服务器端代理函数,而throw语句应该改为$PSCmdlet.ThrowTerminatingError($_) - 参见GitHub issue #10863
虽然这个辅助函数很有用,但是本来就不应该需要它,因为Select-String应该默认操作格式化后的输出。
即,对于不是字符串(文本)的输入,Select-String 应该搜索与您在终端中看到的同样丰富格式的文本表示。
注意:正如 marsze 的答案所指出的那样,在编程使用中,为了保证健壮性,您应该利用 PowerShell 的面向对象特性并查询属性,使用 Where-Object。然而,对于快速而不严格的交互使用,通过显示的表示进行搜索非常方便。 GitHub 建议 #10726 提出了这个建议,尽管似乎存在向后兼容性问题,但我认为不应该有这种问题。
您可以从marsze的答案中适应代理函数方法,以正确实现您所设想的slx函数,作为高级函数Select-StringFormatted,别名为scs(请参见下面的解释;当然,您也可以定义slx)。
注意:
  • The bulk of the code is the auto-generated declaration of the same parameters that Select-String supports; the actual proxying (wrapping) code via Out-String -Stream is minimal.

  • Alias scs is what Select-String's built-in alias sls should have been, given that the official alias prefix for approved verb Select is sc, not ls; in PowerShell [Core] v6+ you an easily verify that with Get-Verb Select. Since the implicit Out-String -Stream behavior should be Select-String's default behavior anyway, I think it makes sense to pick this alias; if/when Select-String gets fixed, you can redefine scs to point to Select-String.

  • All parameters supported as of v7.0 are declared; if you try to use ones only introduced in 7.0 in earlier versions, namely -Culture, -Raw, and -NoEmphasis, they are ignored and a warning is emitted.

  • Example command (compare to the output from 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                                                                                        
    
注意:下面的功能也可以作为一个MIT许可的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()
  }
    
}

0

这种情况经常出现。其他选项。在使用 get-service 命令时,-name 和 -displayname 都可以使用通配符:

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

或者如果通配符不可用,但您需要知道属性名称(通常是列标题),在这种情况下为displayname:

get-service | where displayname -match win

有时候这样做会得到一些结果。这取决于对象的字符串版本变成什么:
get-service | where { $_ -match 'win' } 

有时候将所有内容转换为字符串并搜索是很有用的。我不排斥这样做。"/i" 不区分大小写。
get-service | findstr /i win

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接