Так я делаю, например:
$OUs = Get-ADOrganizationalUnit <blah>
Я хочу найти позицию в массиве для «Тест» (т. е. я хочу провести некоторое тестирование, где я могу сослаться на позицию в array
, в которой находится $OU.Name -eq "Test"
, например $OUs[6]
).
Я мог бы сделать что-то вроде:
$number = 0
foreach ($OU in $OUs)
{
"$($OU.name) - $number"
$number += 1
}
Есть ли более быстрый и простой способ?
Почему важно получить индекс?
Что произойдет, если критериям соответствуют несколько подразделений? Вы хотите, чтобы решение нашло их все или только первое или последнее?
@emanresu, я отредактировал свой вопрос, чтобы добавить немного деталей, так что, вероятно, это моя вина, извините :-).
@SantiagoSquarzon, чтобы я мог легко проводить тестирование, например. Если у меня есть $OU и цикл foreach ($OU в $OUs) для выполнения <чего-то>, а в $OU 40 строк/элементов, я хочу иметь возможность сказать $OU = $OUs[5] поскольку я знаю, что, например, $OU вызовет ошибку. Хотя даже для меня это звучит немного искаженно :-)
@Badger Для этого вам не нужно знать индекс — просто отфильтруйте список и затем работайте только с соответствующими подразделениями: $OUs |Where-Object Name -eq Test |ForEach-Object { <# $_ now references an OU with name 'Test', work with it in here #> }
@MathiasR.Jessen ах, я неправильно сформулировал свой вопрос. Ответ ниже ответил на мой вопрос, но на самом деле это ответ на вопрос, который я ДОЛЖЕН был задать! Меня раздражает, что я сам об этом не подумал, но да, $OU = $OUs | Where-Object {$_.Name -eq "test"} дал мне то, что я хотел (но не просил должным образом). Спасибо!!
@MathiasR.Jessen Это так забавно, на самом деле это первый ответ, который я опубликовал, но затем я удалил его, потому что думал, что OP действительно нужно знать индекс по определенной причине.
Чтобы получить только индекс объекта со свойством name
, значение которого равно test
, вы можете сделать это в одной строке следующим образом:
$object1 = New-Object psobject -Property @{'Name'='test'}
$object2 = New-Object psobject -Property @{'Name'='nope'}
$myArray = @($object1, $object2)
$testIndex = $myArray.IndexOf(($myArray.Where({$_.name -eq 'test'}))[0])
В приведенном выше подходе, если объекта с таким значением нет, он вернет -1
. Также обратите внимание, что если критериям соответствуют несколько объектов, будет возвращен только индекс первого возвращенного элемента. Это связано с взятием элемента с индексом 0 из массива, возвращаемого методом Where
.
Или это:
$object1 = New-Object psobject -Property @{'Name'='test'}
$object2 = New-Object psobject -Property @{'Name'='nope'}
$myArray = @($object1, $object2)
#this will just output the index to the terminal
$myArray.ForEach({
if ($_.name -eq 'test'){
$myArray.IndexOf($_)
}
})
#you can capture the index instead, like this:
$testIndex = $myArray.ForEach({
if ($_.name -eq 'test'){
$myArray.IndexOf($_)
}
})
Это также дает -1
, когда совпадений нет.
Отлично, спасибо! $myArray.IndexOf(($myArray.Where({$_.name -eq 'test'}))[0]) сработал для меня как шарм.
Сначала я неправильно понял, о чем вы спрашиваете, поэтому удалил исходные ответы. Надеюсь, моя третья попытка — это то, что вы ищете.