微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

混合 Where-Object/ForEach-Object 语法 示例 1示例 2

如何解决混合 Where-Object/ForEach-Object 语法 示例 1示例 2

我如何优雅地将 Where-ObjectForEach-Object 杂交?

Where-Object cmdlet 有一种非常优雅的方式来过滤对象: 其中使用的是语法:

... |Where-Object { $_.Id -eq 2 } | ...

现在可以写成:

... |Where-Object Id -eq 2 | ...

我正在寻找一个类似的管道条件语句,但不是过滤管道中的对象,我想更改相关对象在管道中并通过一切。像这样:

... |ForEach-Object { if ($_.Id -eq 2) { $_.Name = 'test' }; $_ } | ...

换句话说,有没有办法用更少的括号、圆括号和当前对象($_)引用来编写上述语法。就像在 self-answer 中一样但没有使用附加功能

解决方法

使用 MetaProgramming 模块,我能够在 If-Object cmdlet 之上编写一个 Where-Object cmdlet:

function If-Object {
    [CmdletBinding(DefaultParameterSetName='EqualSet',HelpUri='https://go.microsoft.com/fwlink/?LinkID=2096806',RemotingCapability='None')]
    param(
        [Parameter(ValueFromPipeline=$true)]
        [psobject]
        ${InputObject},[Parameter(ParameterSetName='ScriptBlockSet',Mandatory=$true,Position=0)]
        [scriptblock]
        ${FilterScript},[Parameter(ParameterSetName='Not',Position=0)]
        [Parameter(ParameterSetName='CaseSensitiveEqualSet',Position=0)]
        [Parameter(ParameterSetName='NotEqualSet',Position=0)]
        [Parameter(ParameterSetName='CaseSensitiveNotEqualSet',Position=0)]
        [Parameter(ParameterSetName='GreaterThanSet',Position=0)]
        [Parameter(ParameterSetName='CaseSensitiveGreaterThanSet',Position=0)]
        [Parameter(ParameterSetName='LessThanSet',Position=0)]
        [Parameter(ParameterSetName='CaseSensitiveLessThanSet',Position=0)]
        [Parameter(ParameterSetName='GreaterOrEqualSet',Position=0)]
        [Parameter(ParameterSetName='CaseSensitiveGreaterOrEqualSet',Position=0)]
        [Parameter(ParameterSetName='LessOrEqualSet',Position=0)]
        [Parameter(ParameterSetName='CaseSensitiveLessOrEqualSet',Position=0)]
        [Parameter(ParameterSetName='LikeSet',Position=0)]
        [Parameter(ParameterSetName='CaseSensitiveLikeSet',Position=0)]
        [Parameter(ParameterSetName='NotLikeSet',Position=0)]
        [Parameter(ParameterSetName='CaseSensitiveNotLikeSet',Position=0)]
        [Parameter(ParameterSetName='MatchSet',Position=0)]
        [Parameter(ParameterSetName='CaseSensitiveMatchSet',Position=0)]
        [Parameter(ParameterSetName='NotMatchSet',Position=0)]
        [Parameter(ParameterSetName='CaseSensitiveNotMatchSet',Position=0)]
        [Parameter(ParameterSetName='ContainsSet',Position=0)]
        [Parameter(ParameterSetName='CaseSensitiveContainsSet',Position=0)]
        [Parameter(ParameterSetName='NotContainsSet',Position=0)]
        [Parameter(ParameterSetName='CaseSensitiveNotContainsSet',Position=0)]
        [Parameter(ParameterSetName='InSet',Position=0)]
        [Parameter(ParameterSetName='CaseSensitiveInSet',Position=0)]
        [Parameter(ParameterSetName='NotInSet',Position=0)]
        [Parameter(ParameterSetName='CaseSensitiveNotInSet',Position=0)]
        [Parameter(ParameterSetName='IsSet',Position=0)]
        [Parameter(ParameterSetName='IsNotSet',Position=0)]
        [Parameter(ParameterSetName='EqualSet',Position=0)]
        [ValidateNotNullOrEmpty()]
        [string]
        ${Property},[Parameter(ParameterSetName='InSet',Position=1)]
        [Parameter(ParameterSetName='CaseSensitiveEqualSet',Position=1)]
        [Parameter(ParameterSetName='NotEqualSet',Position=1)]
        [Parameter(ParameterSetName='CaseSensitiveNotEqualSet',Position=1)]
        [Parameter(ParameterSetName='GreaterThanSet',Position=1)]
        [Parameter(ParameterSetName='CaseSensitiveGreaterThanSet',Position=1)]
        [Parameter(ParameterSetName='LessThanSet',Position=1)]
        [Parameter(ParameterSetName='CaseSensitiveLessThanSet',Position=1)]
        [Parameter(ParameterSetName='GreaterOrEqualSet',Position=1)]
        [Parameter(ParameterSetName='CaseSensitiveGreaterOrEqualSet',Position=1)]
        [Parameter(ParameterSetName='LessOrEqualSet',Position=1)]
        [Parameter(ParameterSetName='CaseSensitiveLessOrEqualSet',Position=1)]
        [Parameter(ParameterSetName='LikeSet',Position=1)]
        [Parameter(ParameterSetName='CaseSensitiveLikeSet',Position=1)]
        [Parameter(ParameterSetName='NotLikeSet',Position=1)]
        [Parameter(ParameterSetName='CaseSensitiveNotLikeSet',Position=1)]
        [Parameter(ParameterSetName='MatchSet',Position=1)]
        [Parameter(ParameterSetName='CaseSensitiveMatchSet',Position=1)]
        [Parameter(ParameterSetName='NotMatchSet',Position=1)]
        [Parameter(ParameterSetName='CaseSensitiveNotMatchSet',Position=1)]
        [Parameter(ParameterSetName='ContainsSet',Position=1)]
        [Parameter(ParameterSetName='CaseSensitiveContainsSet',Position=1)]
        [Parameter(ParameterSetName='NotContainsSet',Position=1)]
        [Parameter(ParameterSetName='CaseSensitiveNotContainsSet',Position=1)]
        [Parameter(ParameterSetName='EqualSet',Position=1)]
        [Parameter(ParameterSetName='CaseSensitiveInSet',Position=1)]
        [Parameter(ParameterSetName='NotInSet',Position=1)]
        [Parameter(ParameterSetName='CaseSensitiveNotInSet',Position=1)]
        [Parameter(ParameterSetName='IsSet',Position=1)]
        [Parameter(ParameterSetName='IsNotSet',Position=1)]
        [System.Object]
        ${Value},[Parameter(ParameterSetName='EqualSet')]
        [Alias('IEQ')]
        [switch]
        ${EQ},[Parameter(ParameterSetName='CaseSensitiveEqualSet',Mandatory=$true)]
        [switch]
        ${CEQ},[Parameter(ParameterSetName='NotEqualSet',Mandatory=$true)]
        [Alias('INE')]
        [switch]
        ${NE},[Parameter(ParameterSetName='CaseSensitiveNotEqualSet',Mandatory=$true)]
        [switch]
        ${CNE},[Parameter(ParameterSetName='GreaterThanSet',Mandatory=$true)]
        [Alias('IGT')]
        [switch]
        ${GT},[Parameter(ParameterSetName='CaseSensitiveGreaterThanSet',Mandatory=$true)]
        [switch]
        ${CGT},[Parameter(ParameterSetName='LessThanSet',Mandatory=$true)]
        [Alias('ILT')]
        [switch]
        ${LT},[Parameter(ParameterSetName='CaseSensitiveLessThanSet',Mandatory=$true)]
        [switch]
        ${CLT},[Parameter(ParameterSetName='GreaterOrEqualSet',Mandatory=$true)]
        [Alias('IGE')]
        [switch]
        ${GE},[Parameter(ParameterSetName='CaseSensitiveGreaterOrEqualSet',Mandatory=$true)]
        [switch]
        ${CGE},[Parameter(ParameterSetName='LessOrEqualSet',Mandatory=$true)]
        [Alias('ILE')]
        [switch]
        ${LE},[Parameter(ParameterSetName='CaseSensitiveLessOrEqualSet',Mandatory=$true)]
        [switch]
        ${CLE},[Parameter(ParameterSetName='LikeSet',Mandatory=$true)]
        [Alias('ILike')]
        [switch]
        ${Like},[Parameter(ParameterSetName='CaseSensitiveLikeSet',Mandatory=$true)]
        [switch]
        ${CLike},[Parameter(ParameterSetName='NotLikeSet',Mandatory=$true)]
        [Alias('INotLike')]
        [switch]
        ${NotLike},[Parameter(ParameterSetName='CaseSensitiveNotLikeSet',Mandatory=$true)]
        [switch]
        ${CNotLike},[Parameter(ParameterSetName='MatchSet',Mandatory=$true)]
        [Alias('IMatch')]
        [switch]
        ${Match},[Parameter(ParameterSetName='CaseSensitiveMatchSet',Mandatory=$true)]
        [switch]
        ${CMatch},[Parameter(ParameterSetName='NotMatchSet',Mandatory=$true)]
        [Alias('INotMatch')]
        [switch]
        ${NotMatch},[Parameter(ParameterSetName='CaseSensitiveNotMatchSet',Mandatory=$true)]
        [switch]
        ${CNotMatch},[Parameter(ParameterSetName='ContainsSet',Mandatory=$true)]
        [Alias('IContains')]
        [switch]
        ${Contains},[Parameter(ParameterSetName='CaseSensitiveContainsSet',Mandatory=$true)]
        [switch]
        ${CContains},[Parameter(ParameterSetName='NotContainsSet',Mandatory=$true)]
        [Alias('INotContains')]
        [switch]
        ${NotContains},[Parameter(ParameterSetName='CaseSensitiveNotContainsSet',Mandatory=$true)]
        [switch]
        ${CNotContains},Mandatory=$true)]
        [Alias('IIn')]
        [switch]
        ${In},[Parameter(ParameterSetName='CaseSensitiveInSet',Mandatory=$true)]
        [switch]
        ${CIn},[Parameter(ParameterSetName='NotInSet',Mandatory=$true)]
        [Alias('INotIn')]
        [switch]
        ${NotIn},[Parameter(ParameterSetName='CaseSensitiveNotInSet',Mandatory=$true)]
        [switch]
        ${CNotIn},[Parameter(ParameterSetName='IsSet',Mandatory=$true)]
        [switch]
        ${Is},[Parameter(ParameterSetName='IsNotSet',Mandatory=$true)]
        [switch]
        ${IsNot},Mandatory=$true)]
        [switch]
        ${Not},Position=2)]
        [Parameter(ParameterSetName='CaseSensitiveEqualSet',Position=2)]
        [Parameter(ParameterSetName='NotEqualSet',Position=2)]
        [Parameter(ParameterSetName='CaseSensitiveNotEqualSet',Position=2)]
        [Parameter(ParameterSetName='GreaterThanSet',Position=2)]
        [Parameter(ParameterSetName='CaseSensitiveGreaterThanSet',Position=2)]
        [Parameter(ParameterSetName='LessThanSet',Position=2)]
        [Parameter(ParameterSetName='CaseSensitiveLessThanSet',Position=2)]
        [Parameter(ParameterSetName='GreaterOrEqualSet',Position=2)]
        [Parameter(ParameterSetName='CaseSensitiveGreaterOrEqualSet',Position=2)]
        [Parameter(ParameterSetName='LessOrEqualSet',Position=2)]
        [Parameter(ParameterSetName='CaseSensitiveLessOrEqualSet',Position=2)]
        [Parameter(ParameterSetName='LikeSet',Position=2)]
        [Parameter(ParameterSetName='CaseSensitiveLikeSet',Position=2)]
        [Parameter(ParameterSetName='NotLikeSet',Position=2)]
        [Parameter(ParameterSetName='CaseSensitiveNotLikeSet',Position=2)]
        [Parameter(ParameterSetName='MatchSet',Position=2)]
        [Parameter(ParameterSetName='CaseSensitiveMatchSet',Position=2)]
        [Parameter(ParameterSetName='NotMatchSet',Position=2)]
        [Parameter(ParameterSetName='CaseSensitiveNotMatchSet',Position=2)]
        [Parameter(ParameterSetName='ContainsSet',Position=2)]
        [Parameter(ParameterSetName='CaseSensitiveContainsSet',Position=2)]
        [Parameter(ParameterSetName='NotContainsSet',Position=2)]
        [Parameter(ParameterSetName='CaseSensitiveNotContainsSet',Position=2)]
        [Parameter(ParameterSetName='InSet',Position=2)]
        [Parameter(ParameterSetName='CaseSensitiveInSet',Position=2)]
        [Parameter(ParameterSetName='NotInSet',Position=2)]
        [Parameter(ParameterSetName='CaseSensitiveNotInSet',Position=2)]
        [Parameter(ParameterSetName='IsSet',Position=2)]
        [Parameter(ParameterSetName='IsNotSet',Position=2)]
        [Parameter(ParameterSetName='EqualSet',Position=2)]
        [ValidateNotNullOrEmpty()]
        ${Process})

    begin
    {
        try {
            $outBuffer = $null
            if ($PSBoundParameters.TryGetValue('OutBuffer',[ref]$outBuffer))
            {
                $PSBoundParameters['OutBuffer'] = 1
            }
            [Void]$PSBoundParameters.Remove("Process")
            
            $wrappedCmd = $ExecutionContext.InvokeCommand.GetCommand('Microsoft.PowerShell.Core\Where-Object',[System.Management.Automation.CommandTypes]::Cmdlet)
        } catch {
            throw
        }
    }

    process
    {
        try {
            if (& $wrappedCmd @PSBoundParameters) {
                if ($Process -is [ScriptBlock]) { & $Process }
                else { $_.$Property = $Process }
            }
            $_
        } catch {
            throw
        }
    }
}

示例 1

$Test = @(
    [PSCustomObject]@{Id = 1; Name = 'One'}
    [PSCustomObject]@{Id = 2; Name = 'Two'}
    [PSCustomObject]@{Id = 3; Name = 'Three'}
)

$Test |If-Object Id -eq 2 'test' |Format-Table

  Id Name
  -- ----
   1 One
test Two
   3 Three

示例 2

$Test = @(
    [PSCustomObject]@{Id = 1; Name = 'One'}
    [PSCustomObject]@{Id = 2; Name = 'Two'}
    [PSCustomObject]@{Id = 3; Name = 'Three'}
)

$Test |If-Object Id -eq 2 { $_.Name = 'test' } |Format-Table

Id Name
-- ----
 1 One
 2 test
 3 Three

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。