PowerShell - Win32_OperatingSystem中的Select-Object显示相当奇怪

时间:2013-03-01 01:32:53

标签: powershell if-statement wmi psobject

这里的第一次海报,我是一个初学者,我一直热衷于让我的PowerShell脚本技能达到最佳状态,而且我遇到了令人困惑的事情...

我已经制作了一个脚本来查询计算机集合,我想查询Win32_OperatingSystem,但只是推断Build编号,这样我就可以用它填充我的PSObject。我正在尝试添加一些If逻辑,这样如果内部版本号为7601,我可以在我的操作系统列下编写一条消息。

我遇到的问题是,BuildNumber值以@ {BuildNumber = 7601}而不是7601的形式出现。那个,我的If声明被塞了。

$Machines = Get-Content .\Computers.txt

Foreach($Machine in $Machines)
{
    $sweet = (Get-WmiObject -Class Win32_OperatingSystem -computer $Machine | Select-Object BuildNumber)
    $dversion = if ($sweet -eq "@{BuildNumber=7601}") {Yes!} else {"Nooooo!"}

    New-Object PSObject -Property @{
    ComputerName = $Machine
    Sweet = $sweet
    OS = $dversion

}
}

2 个答案:

答案 0 :(得分:2)

问题是Get-WMIObject cmdlet正在返回哈希表。然后,Select-Object只返回您想要的BuildNumber部分,BuildNumber属性及其值。您需要添加-ExpandProperty参数以仅返回值,而不是名称/值对。

    Get-WMIObject -Class Win32_OperatingSystem | Select-Object BuildNumber

返回

    @{BuildNumber=7601}

使用ExpandProperty

    Get-WMIObject -Class Win32_OperatingSystem | Select-Object -ExpandProperty BuildNumber

返回

    7601

答案 1 :(得分:1)

使用ping测试跳过不可用的计算机的另一个选项。

Get-Content .\Computers.txt | Where-Object {Test-Connection -ComputerName $_ -Count 1 -Quiet} | Foreach-Object {

    $sweet =  Get-WmiObject -Class Win32_OperatingSystem -ComputerName $_ | Select-Object -ExpandProperty BuildNumber

    New-Object PSObject -Property @{
        ComputerName = $_.__SERVER
        Sweet =  $sweet
        OS = if ($sweet -eq 7601) {'Yes!'} else {'Nooooo!'}    
    }

}