Get-ItemProperty指望1个结果不准确?

时间:2017-05-08 16:47:22

标签: powershell

我有一个奇怪的问题,很可能我在这里遗漏了一些东西。 我有这个功能:

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?

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

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或更早版本。