是否有可能转换以下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
是否有可能转换以下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
参数是强制性的。如果不指定参数名称,则无法调用此命令,并且没有属性名称表示“此对象”。
您可以编写自己的管道函数,如下所示:
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'
$env:Path -split ";" | where { $_.StartsWith("C:\Program") -eq $True }