我有一个包含不同行的数组,其中一列标识"记录" "类型&#34。我想遍历这个数组,并根据该值将每个项目排序到一个新数组中,以便每个类型都有一个数组。
这是我到目前为止所拥有的:
$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
- ~~~~~~~~~赋值表达式无效。赋值运算符的输入必须是能够接受的对象 分配,例如变量或属性。
- CategoryInfo:ParserError:(:) [],ParentContainsErrorRecordException
- FullyQualifiedErrorId:InvalidLeftHandSide
我尝试过使用$($ oc),但这也不起作用。如果我将其更改为我的一个动态创建的数组(如$ user)的名称,代码工作正常,除了它将所有内容加载到$ user数组中(显然)。
我尝试的原因(' $' + $ oc)是因为这是我可以让ISE输出$ user的唯一方法。
我也试过(' $' + $ oc).add($ d),但它似乎将其视为字符串而不是数组。
任何指针都表示赞赏。
答案 0 :(得分:3)
我没有使用动态命名变量,而是使用字典类型,例如哈希表:
# 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 points out,如果以上内容过于冗长,您还可以Group-Object
为您构建哈希表:
$objectsByClass = $Data |Group-Object objectClass -AsHashTable
答案 1 :(得分:2)
使用Get-Variable
和Set-Variable
cmdlet:
$curVal = Get-Variable -Name $oc -ValueOnly
Set-Variable -Name $oc -Value ($curVal+$d)
但请注意,最好先在局部变量中构建此数组,然后将其分配给运行时命名的"变量一次,因为这些get和set操作会变慢。