Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell筛选项中项的内在索引(例如,使用Where对象)_Powershell - Fatal编程技术网

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。