如何解决混合 Where-Object/ForEach-Object 语法 示例 1示例 2
我如何优雅地将 Where-Object
与 ForEach-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 举报,一经查实,本站将立刻删除。