Поиск элемента в массиве - PullRequest
0 голосов
/ 08 сентября 2018
$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 Value

Может кто-нибудь сказать мне, как искать индекс элемента, используя значение

Функцияниже не работает для меня

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

и возвращает ошибку ниже

Ошибка вызова метода, потому что [System.Object []] не содержит метод с именем 'индекс'.В строке: 20 символов: 15 + $ array.indexof <<<< ('XXX Value') + CategoryInfo: InvalidOperation: (indexof: String) [], RuntimeException + FullyQualifiedErrorId: MethodNotFound </p>

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

Как указано в Ответ Incorrigible1 , $LogsProperties уже является массивом, элементами которого являются [pscustomobject] экземпляры со свойствами FileName, Path и Line.

(Ваша попытка создать $Array из $LogsProperties не только не нужна, но и не удалась, поскольку все элементы $Array в конечном итоге ссылаются на массив, на который ссылается $LogsProperties в целом.)

Для использования метода .IndexOf() на экземплярах массива требуется [1] , PSv3 + . PSv3 + также позволяет вам использовать перечисление члена , поэтому вы можете применить .IndexOf() к $LogsProperties.Line для поиска в массиве .Line значений свойств:

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

В PSv2 вы можете использовать цикл foreach для определения индекса:

$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.

[1] Тип System.Array, базовый тип для всех массивов, также имеет a static .IndexOf() метод , который также доступен в PSv2. Однако, учитывая необходимость поиска значений свойств .Line элементов массива $LogProperties, здесь это не поможет, если сначала не будет создан отдельный массив с только значениями свойств .Line.

0 голосов
/ 08 сентября 2018

Таким образом, ваш $logsProperties является уже массивом.Вы можете фильтровать, используя Where-Object или Where метод массива:

$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*'}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...