2017-05-08 39 views
1

我有一个奇怪的问题,很可能我在这里错过了一些东西。 我有这样的功能:Get-ItemProperty计数1结果不准确?

function CheckJava { 
    $JavaVersion = (@(Get-ItemProperty HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion) | where { $_.DisplayName -like "java*" }).Count 
    if ($JavaVersion -eq "" -or $JavaVersion -le 1) { 
     Write-Host -NoNewLine "Java Detected - 64bit" 
     Write-Host -ForegroundColor Yellow " [ NO ]" 
     $global:JavaInstalled = $false 
    } else { 
     Write-Host -NoNewLine "Java Detected - 64bit" 
     Write-Host -ForegroundColor Green " [ YES ]" 
     $global:JavaInstalled = $true 
    } 
} 

有趣的是,如果我运行此:

(@(Get-ItemProperty HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion) | where { $_.DisplayName -like "java*" })) 

我得到的结果。如果结果中有2项,.Count实际上工作正常,但如果只有一个返回结果,则.Count返回空。我期望1?

我在这里错过了一些非常明显的东西吗?

回答

1

您错位了数组子表达式运算符。更改此:

(@(Get-ItemProperty ... | Select-Object ...) | where { ... }).Count 

到这一点:

@(Get-ItemProperty ... | Select-Object ... | where { ... }).Count 

,代码会做你的期望。

的理由让你观察到的现象是:当Get-ItemProperty | Select-Object管道的回报只是一个单一的结果,@(...)转弯导致与一个元素的数组,但后续| Where-Object再次解开数组,所以你还是结了一个对象而不是一个元素的数组。

在PowerShell v3和更新版本上,仍然应该给你1的结果,所以你可能使用的是PowerShell v2或更旧版本。

+0

我知道这很简单。 :)谢谢Ansgar!非常感激! –