代码背后的想法是抓住所有计算机。然后,它将对计算机进行过滤,并提取OS和OS版本。然后它进行测试以查看操作系统版本是否在阵列内。如果该值在那里,它将增加1。如果该项目不在数组中,它将添加该项目并将其值设置为1。但是,结果与预期不符。此网络上有1000多台计算机,但是,每个OS的结果仅显示2。结果需要放在表中以用于其他用途。
$Adomains = @{}
$Computers = Get-ADComputer -Filter * -Properties *
foreach ($ADPC in $Computers) {
if ($ADPC.OperatingSystem -eq $null) { $os = 'NULL'}
else { $os = $ADPC.OperatingSystem }
if ($ADPC.OperatingSystemVersion -eq $null) { $osver = 'NULL'}
else { $osver = $ADPC.OperatingSystemVersion }
if ($Adomains."$os - $osver"){
$Adomains."$os - $osver"++
} else {
$Adomains | Add-Member -MemberType NoteProperty -Name "$os - $osver" -Value 1
}
}
$Adomains
这是上面代码的结果:
Name Value
---- -----
Windows Embedded Standard -... 2
Windows 10 Enterprise - 10.... 2
Windows 10 Pro - 10.0 (17134) 2
Windows 10 Enterprise - 10.... 2
Windows 8.1 Pro - 6.3 (9600) 2
Windows 10 Pro - 10.0 (16299) 2
unknown - unknown 2
Windows 10 Enterprise - 10.... 2
Windows 10 Pro - 10.0 (14393) 2
Windows 10 Pro - 10.0 (15063) 2
Windows 7 Professional - 6.... 2
Windows 10 Pro - 10.0 (10586) 2
我试图弄清楚我的逻辑错误在哪里。
答案 0 :(得分:2)
您的方法过于复杂。
$Adomains = Get-ADComputer -Filter * -Properties OperatingSystem,OperatingSystemVersion |
Group-Object OperatingSystem,OperatingSystemVersion -NoElement
$Adomains | Format-Table -Autosize
已根据Bacon Bits帮助提示进行了编辑
答案 1 :(得分:0)
关注代码并仅按唯一的OS进行排序,并放置了一个if语句来解决“ $ Null”对象。
$OSes = Get-ADComputer -Filter {enabled -eq $true} -Properties operatingsystem | sort operatingsystem
$Unique = ($OSes | select operatingsystem -Unique).Operatingsystem
$Return = @()
foreach ($U in $Unique) {
$ADOScounting = ($OSes | Where-Object {$_.OperatingSystem -like "$U"}).count
$return += [pscustomobject][ordered] @{
Name = $U
Count = if ($ADOScounting -eq $null) {"0"} else {$ADOScounting}
}
}
$Return
答案 2 :(得分:0)
您的原始错误是多方面的。首先,您使用的是哈希表,而不是数组(这似乎是故意的,您只是弄错了术语)。
问题的主要根源是,当您第一次尝试添加新的操作系统时,没有添加新的键/值对,而是向哈希表对象本身添加了一个属性。
您使用.
来访问属性和哈希表(条目)。
因此,第一次添加该属性后会发生什么,就是当代码到来以if ($Adomain."$os - $osver")
检查存在性时,结果为$true
;到目前为止一切都很好。
然后您做$Adomains."$os - $osver"++
,这很奇怪。
该值的 read 来自该属性,因此为1
。 write 在哈希表中创建一个值为2的新条目(属性中的1
加1
)。现在,属性为1
,输入值为2
。
下次,这种情况再次发生,读取来自该属性,而写入操作进入该条目,因此您将永久写入2
。
要在代码中轻松解决此问题,请更改以下内容:
} else {
$Adomains | Add-Member -MemberType NoteProperty -Name "$os - $osver" -Value 1
}
对此:
} else {
$Adomains."$os - $osver" = 1
}
但是更好的方法是使用Group-Object
,它已经可以满足您的要求:
$Computers = Get-ADComputer -Filter * -Properties OperatingSystem,OperatingSystemVersion |
Group-Object -Property {"$($_.OperatingSystem) - $($_.OperatingSystemVerson)"}
它不会将null值转换为漂亮的字符串,但是您可以根据需要将该逻辑放在脚本块中。
它返回组对象,但是如果您想返回真实的哈希表,则可以添加-AsHashTable -AsString
。