如何动态引用电源外壳变量



我有一个包含不同行的数组,其中一列标识"记录"类型"。 我想遍历这个数组,并根据该值将每个项目排序到一个新数组中,以便每种类型都有一个数组。

这是我到目前为止所拥有的:

$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-VariableSet-Variablecmdlet:

$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

最新更新