我有一个包含不同行的数组,其中一列标识"记录"类型"。 我想遍历这个数组,并根据该值将每个项目排序到一个新数组中,以便每种类型都有一个数组。
这是我到目前为止所拥有的:
$data = Get-ADObject -SearchBase $sb -filter * -properties * | select samaccountname,canonicalname,objectclass,distinguishedname | sort objectclass,samaccountname
$oct = $data | select objectclass -Unique
foreach ($o in $oct)
{
$oc = $o.objectclass
Remove-Variable -name "$oc"
New-Variable -name "$oc" -value @()
}
$d = @()
$user = @()
foreach ($d in $data)
{
$oc = $d.objectclass
foreach ($o in $oct)
{
$1 = $o.objectclass
if ($1 -eq $oc)
{
('$' + $oc) += $d
}
}
}
(以下行:Remove-Variable -name "$oc",$d = @(),$user = @()用于测试目的,因此请忽略它们)
这在我尝试动态引用新数组的行中效果很好。 我做错了什么,我该如何解决?
错误文本为:
- ('$' + $oc) += $d
~~~~~~- ~~~ 赋值表达式无效。赋值运算符的输入必须是能够接受的对象 赋值,例如变量或属性。
- 类别信息: 解析器错误: (:) [], 父包含错误记录异常
- 完全限定错误 ID : 无效左侧
我尝试过使用 $($oc),但这也不起作用。 如果我将其更改为动态创建的数组之一的名称,例如 $user,则代码工作正常,除了它将所有内容加载到 $user 数组中(显然)。
我尝试('$' + $oc)的原因是因为这是我可以让ISE输出$user的唯一方法。
我也尝试了('$' + $oc).add($d),但它似乎将其视为字符串而不是数组。
任何指示都值得赞赏。
使用Get-Variable
和Set-Variable
cmdlet:
$curVal = Get-Variable -Name $oc -ValueOnly
Set-Variable -Name $oc -Value ($curVal+$d)
但请注意,您最好先在局部变量中构建此数组,然后将其分配给"运行时命名"变量一次,因为这些获取和设置操作会慢得多。
与其摆弄动态命名的变量,我会使用字典类型,例如哈希表:
# initialize an empty hashtable
$objectsByClass = @{}
# Define list of properties
$properties = 'samaccountname','canonicalname','objectclass','distinguishedname'
# Retrieve AD objects
$Data = Get-ADObject -SearchBase $sb -filter * -properties $properties | select $properties | sort objectclass,samaccountname
#Populate hashtable
$Data |ForEach-Object {
if(-not $objectsByClass.ContainsKey($_.objectClass)){
# Create entry in hashtable
$objectsByClass[$_.objectClass] = @()
}
# Add entry to dictionary
$objectsByClass[$_.objectClass] += $_
}
现在,您可以按类名访问项目:
$users = $objectsByClass['user']
您可以轻松发现所有类名:
$classNames = $objectsByClass.Keys
正如briantist指出的那样,如果上述内容过于冗长,您也可以Group-Object
为您构建哈希表:
$objectsByClass = $Data |Group-Object objectClass -AsHashTable