PowerShell在where-object中的隐式值属性

问题描述 投票:2回答:3

是否有可能转换以下PS脚本阻止

$env:Path -split ";" | where {$_ -like "c:\Program*"}

到比较语句看起来像

$env:Path -split ";" | where ???WHAT HERE??? -like "c:\Program*"

我需要的东西将替换第一个语句中隐含的$ _变量。

编辑:我的意图是纯粹的好奇心。我更喜欢使用where-object cmdlet的第二种方式,但是,我不知道如何直接在-like运算符的左侧处理管道值

Edit2:什么是比较声明?比较陈述更像是自然语言。 Windows PowerShell 3.0中引入了比较语句。一个例子:

Get-Process | Where-Object PriorityClass -eq "Normal"

资料来源:Where-Object on MSDN

powershell where
3个回答
2
投票

是否有可能转换以下PS脚本阻止

$env:Path -split ";" | where {$_ -like "c:\Program*"}

到比较语句看起来像

$env:Path -split ";" | where ???WHAT HERE??? -like "c:\Program*"

不,那是不可能的。

Where-Object有两种模式。完全表达,一个看起来像这样:

ls | Where-Object -FilterScript { $_.Name -eq 'File.txt' }

在这里,我们正在编写一个包含在每个项目上计算的表达式的脚本块。

完全表达的另一种模式实际上看起来像这样。

ls | Where-Object -Property Name -Value File.txt -Eq

请注意,这里的-Eq是参数而不是运算符。我们正在调用命令,而不是在脚本块中编写表达式。我知道你在想什么。 “但要以这种方式工作,命令需要为每个可以想象的操作员设置不同的参数!”和that's exactly what they do

Where-Object [-InputObject <PSObject>] [-Property] <String> [[-Value] <Object>] [-EQ] [<CommonParameters>]
Where-Object [-InputObject <PSObject>] [-Property] <String> [[-Value] <Object>] [-NE] [<CommonParameters>]
Where-Object [-InputObject <PSObject>] [-Property] <String> [[-Value] <Object>] [-LT] [<CommonParameters>]
[...]

-InputObject参数是管道中的值。 -Property是第一个位置参数。 -Value是第二个位置参数。

问题是-Property参数是强制性的。如果不指定参数名称,则无法调用此命令,并且没有属性名称表示“此对象”。


1
投票

您可以编写自己的管道函数,如下所示:

    Add-Type -AssemblyName System.Collections

    function where-special { 
    [cmdletbinding()]

    param(
        [Parameter(ValueFromPipeline=$true)]
        [object[]]$piped,
        [Parameter(Position=1, ParameterSetName="eq")]
        [object]$eq,
        [Parameter(Position=1, ParameterSetName="like")]
        [object]$like,
        [Parameter(Position=1, ParameterSetName="match")]
        [object]$match )

    Begin {
        [System.Collections.Generic.List[object]]$found = @()

        $toDo = [Scriptblock]::Create( 'if( $piped -' + $PSCmdlet.ParameterSetName + ' $' + $PSCmdlet.ParameterSetName + ') { $found.Add( $piped ) }' )
    }

    Process  {

        & $toDo
    }

    End {
        return $found.ToArray()
    }
}


$env:Path -split ";" | where-special -like 'C:\Windows' 

-1
投票
$env:Path -split ";" | where { $_.StartsWith("C:\Program") -eq $True }
© www.soinside.com 2019 - 2024. All rights reserved.