我在尝试查找包含Active Directory用户的数组中项目的索引号时遇到问题。
我按如下方式创建数组:
$outarray = @()
$outarray = get-aduser -Filter * -Properties LastLogon | select "Name","SAMAccountName","LastLogon" | sort samaccountname
现在我有一个数组中的用户,我可以使用标准变量查询来证明它
$outarray[0]
$outarray[1]
完全按照我的期望返回。
BUT
我完全无法在数组中搜索name
或SAMAccountName
的索引,因为它们是数组的属性。
$index = [array]::IndexOf($outarray.samaccountname, "testuser")
仅当testuser
是数组中的第一个用户时,才返回-1(未找到)或0。 我在数组中找不到任何其他用户索引。
获取索引后的目标是使用它来更新lastlogon的属性。如果我手动执行此操作 e.g。
$outarray[123].lastlogon = 12345678
我能做到这一点的唯一方法是最初手动构建数组,一次一个条目而不是直接填充
foreach ($user in $outArray)
{
$myobj = @()
$myobj = "" | Select "Name","SAMAccountName","LastLogon"
#fill the object
$myobj.Name = $user.name
$myobj.SAMAccountName = $user.samaccountname
$myobj.LastLogon = $user.LastLogon
#Add the object to the array
$userarray += $myobj
}
$userarray[[array]::IndexOf($userarray.samaccountname, "testuser")].LastLogon = 12345678
然后搜索工作。我认为这与属性类型有关,但在这个阶段我完全超出了我的深度。
在此先感谢您的帮助,我不是PowerShell阵列的专家,他们让我很困惑! :)
答案 0 :(得分:1)
我认为你以错误的方式看待这个问题。而不是找到特定项目的索引,然后通过索引访问该项目,您可以通过过滤数组来为要更新的项目执行PoSh方式,如下所示:
$userarray | ? {
$_.SamAccountName -eq 'testuser'
} | % {
$_.LastLogon = 12345678
}
或者像这样:
$acct = $userarray | ? { $_.SamAccountName -eq 'testuser' } | select -First 1
$acct.LastLogon = 12345678