在数组中查找项目

时间:2018-09-08 14:19:52

标签: arrays powershell

$LogsPath = '\\someserver\somepath\*'
$LogsProperties = Get-ChildItem -Path $LogsPath -recurse |
Select-String -Pattern '[a-z]' |
Select-Object -Property Filename, Path, Line

$Array = @()
$LogsProperties | foreach {
$Array += $LogsProperties
}

上面的查询将创建一个具有以下值的数组

(破折号是制表符/列)

  

文件名--------------------------路径------------------- -------------------------------------------线

     

FName1 LName1.txt ----------- \\ someserver \ somepath \ FName1   LName1.txt ------------- XXX值
  FName2 LName2.txt ----------- \\ someserver \ somepath \ FName1   LName1.txt ----------- YYY值
  FName3 LName3.txt ----------- \\ someserver \ somepath \ FName1   LName1.txt ------------- ZZZ值

$Array[0]

返回:

  

FName1 LName1.txt ----------- \\ someserver \ somepath \ FName1   LName1.txt ------------- XXX值

有人可以告诉我如何使用值搜索元素的索引

下面的功能不适用于我

$array.indexof('XXX Value')
0 <-- expected result, index of the array

,并将在下面返回错误

  

方法调用失败,因为[System.Object []]不包含   名为“ indexof”的方法。在线:20字符:15   + $ array.indexof <<<<('XXX值')       + CategoryInfo:InvalidOperation:(indexof:String)[],RuntimeException       + FullyQualifiedErrorId:MethodNotFound

2 个答案:

答案 0 :(得分:1)

因此您的$logsProperties已经 一个数组。您可以使用Where-ObjectWhere数组方法进行过滤:

$logsProperties = Get-ChildItem -Path \\someserver\somepath\* -Recurse |
    Select-String -Pattern '[a-z]' |
    Select-Object -Property FileName, Path, Line

过滤:

$logsProperties | Where-Object Line -like '*xxx value*'

或:

$logsProperties.Where{$_.Line -like '*xxx value*'}

答案 1 :(得分:1)

The Incorrigible1's answer中所指出,$LogsProperties已经是一个数组,其元素是具有属性[pscustomobject]FileName和{{1 }}。

(您尝试从Path创建Line不仅是不必要的,而且是无效的,因为$Array的元素最终都引用了$LogsProperties所引用的数组整体上。)

为了在数组实例 [1] 上使用$Array方法,需要 PSv3 + 。 PSv3 +还允许您使用member enumeration,因此可以将$LogsProperties应用于.IndexOf()以便搜索.IndexOf()属性值的数组:

$LogsProperties.Line

PSv2 中,您可以使用.Line循环来确定索引:

$LogsProperties.Line.IndexOf('XXX Value') # -> 0

[1]类型foreach(所有阵列的基本类型)也具有a static .IndexOf() method,在PSv2中也可用。但是,由于需要搜索$i = 0 foreach ($obj in $LogsProperties) { if ($obj.Line -eq 'XXX Value') { break }; ++$i } if ($i -eq $LogsProperties.Count) { $i = -1 } # $i now contains the index of the matching element or -1, if not found. 的数组元素的System.Array属性值,所以这无济于事,除非首先构造仅具有.Line属性值的单独数组