【问题标题】:Powershell OS Count Value IncorrectPowershell 操作系统计数值不正确
【发布时间】:2018-08-01 19:13:28
【问题描述】:

代码背后的想法是获取所有计算机。然后它过滤计算机并提取操作系统和操作系统版本。然后它会测试操作系统版本是否在阵列内。如果该值存在,它将增加 1。如果该项目不在数组中,它将添加该项目并将值设置为 1。但是,结果并不像预期的那样。该网络上有超过 1000 台计算机,但是,结果仅显示每个操作系统 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  

我试图找出我的逻辑错误在哪里。

【问题讨论】:

    标签: powershell active-directory powershell-4.0


    【解决方案1】:

    您的方法在 IMO 过于复杂。

    $Adomains = Get-ADComputer -Filter * -Properties OperatingSystem,OperatingSystemVersion | 
        Group-Object OperatingSystem,OperatingSystemVersion -NoElement
    $Adomains | Format-Table -Autosize
    

    已根据 Bacon Bits 有用提示编辑

    【讨论】:

    • $Adomains | Format-Table -Autosize 可能有助于提供更具可读性的输出,因为默认格式化程序会在 20 个字符后截断。
    【解决方案2】:

    集中代码并仅按唯一操作系统排序,并放置一个解决“$Null”对象的 if 语句。

            $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
    

    【讨论】:

      【解决方案3】:

      您最初的错误是多方面的。首先,您使用的是哈希表,而不是数组(这似乎是有意的,您只是用错了术语)。

      问题的主要来源是,当您第一次尝试添加新操作系统时,您并没有添加新的键/值对,而是将属性添加到哈希表对象本身。

      您可以使用. 来访问这两个属性,如果是哈希表,则访问条目。

      所以在你第一次添加属性后会发生什么,当代码用if ($Adomain."$os - $osver")检查是否存在时,结果是$true;到目前为止一切顺利。

      然后你做$Adomains."$os - $osver"++,这就是奇怪的地方。

      值的读取来自属性,所以是1write 在哈希表中创建一个值为 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

      【讨论】:

        猜你喜欢
        • 2014-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-25
        • 2012-12-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-04
        相关资源
        最近更新 更多