Powershell OS计数值不正确

时间:2018-08-01 19:13:29

标签: powershell active-directory powershell-v4.0

代码背后的想法是抓住所有计算机。然后,它将对计算机进行过滤,并提取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  

我试图弄清楚我的逻辑错误在哪里。

3 个答案:

答案 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的新条目(属性中的11)。现在,属性为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