一个相当基本的脚本 - 在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
}
答案 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 | ...)