我有一个奇怪的问题,很可能我在这里遗漏了一些东西。 我有这个功能:
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*" }))
我得到了结果。 .Count
实际上工作正常,如果结果中有2个项目,但是,如果只有一个返回结果,则.Count
返回空。我期待1?
我错过了一些非常明显的东西吗?
答案 0 :(得分:1)
你错放了数组子表达式运算符。改变这个:
(@(Get-ItemProperty ... | Select-Object ...) | where { ... }).Count
进入这个:
@(Get-ItemProperty ... | Select-Object ... | where { ... }).Count
代码将按照您的预期执行。
您观察到的行为的原因是:当Get-ItemProperty | Select-Object
管道只返回一个结果时,@(...)
会将结果转换为包含一个元素的数组,但随后的| Where-Object
再次展开数组,所以你最终只得到一个对象而不是一个带有一个元素的数组。
在PowerShell v3和更新版本上,仍然会给你1的结果,所以你可能正在使用PowerShell v2或更早版本。