Powershell筛选项中项的内在索引(例如,使用Where对象)
有没有办法获得内在的数字索引(顺序#)Powershell筛选项中项的内在索引(例如,使用Where对象),powershell,Powershell,有没有办法获得内在的数字索引(顺序#) 所选/筛选/匹配对象的 从何处处理对象? 例如: Get-Process | Where-Object -property id -eq 1024 没有使用进一步的代码 ?是否可以获得ID=4的对象的索引 来自某些“内部/隐藏”的Powershell机制??? 或指示对象在何处吐出索引 比赛在哪里举行? (在本例中为1,0为“空闲”进程)您可以将Get processcmdlet的结果捕获为数组,并使用IndexOf()方法获取索引,如果找不到该Id,则
所选/筛选/匹配对象的 从何处处理对象?
例如:
Get-Process | Where-Object -property id -eq 1024
没有使用进一步的代码?是否可以获得ID=4的对象的索引
来自某些“内部/隐藏”的Powershell机制???
或指示对象在何处吐出索引
比赛在哪里举行?
(在本例中为1,0为“空闲”进程)您可以将
Get process
cmdlet的结果捕获为数组,并使用IndexOf()
方法获取索引,如果找不到该Id,则使用-1:
$gp = (Get-Process).Id
$gp.IndexOf(1024)
不,从PowerShell 7.1开始,您需要的没有内置机制
如果只需匹配一个项目-就像您的情况一样-您可以使用数组
类型的静态方法:
$processes = Get-Process
# Find the 0-based index of the process with ID 1024.
[Array]::FindIndex($processes, [Predicate[object]] { param($o) $o.Id -eq 1024 })
请注意,如果找到匹配项,此将返回一个从零开始的索引,否则返回-1
::FindIndex()
方法的优点是只搜索第一个匹配项,而不像Where Object
,从PowerShell 7.1开始,它总是搜索整个输入集合(见下文)。作为一种方法,而不是基于管道的cmdlet,它总是要求输入数组完全位于内存中(管道不需要)
虽然它不会直接解决您的用例,但请注意,有一个概念上相关的,它建议引入一个自动$PSIndex
变量,以便在ForEach对象
和Where对象
脚本块中提供
旁白: 请注意,虽然
[Array]::FindIndex
只查找第一个匹配项的索引,但是对象的限制方式正好相反:从PowerShell 7.1开始,它总是查找所有匹配项,
如果只查找一个匹配项,则效率低下
而相关的确实提供了在第一次匹配后停止处理的方法(例如('long'、'foo'、'bar')。其中({$\Length-eq 3},'First')
),方法仅对内存中的集合进行操作,因此如果基于管道的Where Object
cmdlet也支持此类功能,这将非常有用-请参阅
或类似的东西。添加一个名为line的特性,该特性会为每个对象不断增加
ps | % { $line = 1 } { $_ | add-member line ($line++) -PassThru } | where id -eq 13924 |
select line,id
line Id
---- --
184 13924
我不认为OP想要这个过程ID@Tomalak实际上,这将返回Id 1024的Id数组中的索引。这就是OP想要的,不是吗?(获取内部数字索引)否,它返回进程ID(PID)。:)@Tomalak
$gp=(Get Process).Id
返回一个Id数组IndexOf(1024)
返回该数组中ID 1024的索引(如果该ID不在数组中,则返回-1)。@ZEE$a=Get进程$b=Get Process[10]
无论如何都不是一个好方法,因为在调用Get Process
的两次调用之间,进程的数量可能会发生变化。顺便说一句:GitHub上有一个与概念相关的建议,建议在管道中提供一个自动计数器变量:现在我使用一个具有这种功能性的函数。。。类似于:$a=Get进程$b=获取进程[1024]:$a.IndexOf($b)//返回所需的“完整”对象。。。但是再一次。。。最好从Where对象中吐出索引–PS:正如有人已经注意到的。。。这是为了演示而简化的。。。我现在使用的函数返回所有匹配索引的数组…我发现您提供的信息有趣且有价值。。。然而,我不想在Powershell中玩弄扩展方法或接口语法,因为它有点笨拙。。。(我希望他们能尽快解决这个问题)。。。至于预期的结果。。。对我有一个匹配索引返回数组(我使用的函数有点复杂…为了澄清起见,我缩小了示例的规模)@ZEE,是的,它是模糊的。请注意,我们不是在讨论扩展方法,因为PowerShell根本不支持它们;此外,还需要cast[Predicate[object]]
来告诉PowerShell的方法重载解析如何调用此通用方法;对泛型方法的支持通常是不完整的。归根结底,.FindIndex()
解决方案远远不是PowerShell惯用的解决方案。最后,撇开明显的私利不谈,如果你觉得答案很有价值,并且认为其他人也会这么认为,请投票吧。我很感激,@ZEE。