如何动态引用powershell变量

时间:2017-06-14 14:48:48

标签: arrays powershell

我有一个包含不同行的数组,其中一列标识"记录" "类型&#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),但它似乎将其视为字符串而不是数组。

任何指针都表示赞赏。

2 个答案:

答案 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-VariableSet-Variable cmdlet:

$curVal = Get-Variable -Name $oc -ValueOnly
Set-Variable -Name $oc -Value ($curVal+$d)

但请注意,最好先在局部变量中构建此数组,然后将其分配给运行时命名的"变量一次,因为这些get和set操作会变慢。