2017-05-08 53 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!非常感激! –