1

一个相当基本的脚本 - 在 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
}
4

2 回答 2

3

您正在使用$computer[$i]. 如果您不知道数组应该有多大,但您知道它不会很大,请更改为:

$computers += $child.Name

如果您知道大小,则像这样分配该大小的数组:

$computers = new-object string[] $arraySize

然后你可以索引到数组中,直到size - 1.

如果您不知道大小并认为它会很大,请改用列表,例如:

$computers = new-object system.collections.arraylist
[void]$computers.Add($child.Name)
于 2013-06-12T00:30:09.930 回答
0

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

$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 | ...)
于 2013-06-12T07:46:08.587 回答