将AD计算机名称存储在阵列中

时间:2013-06-11 23:02:44

标签: powershell

一个相当基本的脚本 - 在AD中搜索Ou并导出计算机 - 我想将每台计算机存储到一个数组中,以便稍后循环并对计算机运行一些命令。虽然阵列本身没有太多运气 - 我完全不在赛道上吗?

$computers = @()
$i = 0
$ou = [ADSI]"LDAP://OU=Domain Controllers,DC=test,DC=local"
foreach ($child in $ou.psbase.Children) {
    if ($child.ObjectCategory -like '*computer*') { 
        Write-Host $child.Name 
        $computers[$i] = $child.name
        }
    $i += 1
}

2 个答案:

答案 0 :(得分:3)

您正在使用$computer[$i]索引到一个空数组。如果您不知道数组应该有多大但是您知道它不会很大,请更改为:

$computers += $child.Name

如果您知道大小,那么分配大小如此的数组:

$computers = new-object string[] $arraySize

然后,您可以将数组索引到size - 1

如果您不知道尺寸并认为它很大,请使用列表,例如:

$computers = new-object system.collections.arraylist
[void]$computers.Add($child.Name)

答案 1 :(得分:0)

使用管道,使用Where-Object(别名?)过滤对象,并在ForEach-Object循环(别名%)中输出名称。结果是名称数组或$null(当LDAP查询未返回任何计算机对象时)。

$ou = [ADSI]"LDAP://OU=Domain Controllers,DC=test,DC=local"
$computers = $ou.PSBase.Children |
             Where-Object { $_.ObjectCategory -like '*computer*' } |
             ForEach-Object { $_.Name }

如果您希望在找不到计算机对象时结果为空数组,请在@()中包装命令管道:

$computers = @($ou.PSBase.Children | ...)