https://issues.apache.org/jira/browse/NETBEANS-2523

https://issues.apache.org/jira/browse/NETBEANS-2523

我目前在安装时收到此错误Java SE 运行时环境jre8),更新以前工作正常:

Searching if new version exists...
ERROR: Specified cast is not valid.
The install of jre8 was NOT successful.
Error while running 'C:\ProgramData\chocolatey\lib\jre8\tools\chocolateyInstall.ps1'.
 See log for details.

Chocolatey installed 0/1 packages. 1 packages failed.
 See the log for details (C:\ProgramData\chocolatey\logs\chocolatey.log).

Failures
 - jre8 (exited -1) - Error while running 'C:\ProgramData\chocolatey\lib\jre8\tools\chocolateyInstall.ps1'.
 See log for details.

chocolatey.log(由于 30 000 个字符的长度限制,我无法在此处粘贴,因此我删除了日期)

答案1

我刚刚遇到了这个问题。我做了:

get-childitem hklm:\software\microsoft\windows\currentversion\uninstall\ |
  foreach { write-host $_.pspath; $_ } | get-itemproperty

并且它HKLM:\software\microsoft\windows\currentversion\uninstall\nbi-nb-base-8.2.0.0.201609300101在 Netbeans 8.2 上阻塞了。我在 regedit 中看到 NoModify 有“(无效的 DWORD(32 位)值)”。 get-itemproperty -erroraction continue没有效果。

编辑:Netbeans 人员最终正在修复此问题(但并非真的)。 https://issues.apache.org/jira/browse/NETBEANS-2523

编辑:他们可能永远不会修复它。

答案2

此错误似乎是由于失败而导致的Get-ItemProperty。从您的日志来看,失败的脚本部分如下:

  Write-Output "Searching if new version exists..."
  $checkreg64 = Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion | Where-Object { $_.DisplayName -like '*Java 8*' -and ([Version]$_.DisplayVersion) -eq $version} -ErrorAction SilentlyContinue
  $checkreg32 = Get-ItemProperty HKLM:\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion | Where-Object { $_.DisplayName -like '*Java 8*' -and ([Version]$_.DisplayVersion) -eq $version} -ErrorAction SilentlyContinue

Get-ItemProperty当期望读取类型 X 的注册表项并读取其数据与该项类型的约束不匹配的项时,会发生此失败。研究1 研究2 研究3

解决方案在这种情况下是在注册表中找到无效的键(在$checkreg64和中查询的注册表路径$checkreg32),并手动将其重新创建为值为 1 的 DWORD。

更新:

从注释中可以看出,查询时会得到“指定的强制类型转换无效”的结果Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*。此位置中可能存在一个不相关的键,其中包含无效的子键,导致针对此位置的查询失败。我们应该能够从卸载位置单独解析每个键,以确定我们在查询哪个键时遇到问题。

运行以下命令:

Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | % { write-host "Key Name:" $_.PSChildName }

这应该会返回一些结果,然后会返回错误Specified cast。错误将发生在包含无效子项的项上。

例如,如果上面的结果如下所示:

Key Name: fake_key_name_1
Key Name: fake_key_name_2
Key Name: fake_key_name_3
Get-ItemProperty : Specified cast is not valid.

然后,您能够成功查询的最后一个键是fake_key_name_3。我们无法查询的键是列表中的下一个键。打开 regedit 并浏览到下一个键名(可能是fake_key_name_4)。这就是失败的地方。这里应该有一个无效的子键。修复此问题,然后再次运行该命令。如果没有错误,则一切就绪。如果出现更多有错误的键,请查找并修复它们的无效子键。

在我最初提供的链接示例之一中,用户希望找到一个带有数据 = “(无效的 DWORD(32 位)值)” 的 REG_DWORD 键。这是需要修复的关键。

答案3

这是针对 PowerShell 中此问题的 NetBeans 原因的具体答案,无需手动遍历注册表。

## Check for and fix known exception where broken registry entry breaks Uninstall querying
# https://issues.apache.org/jira/browse/NETBEANS-2523
try {
    Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*,HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* -ea 0 | Out-Null
} catch [System.InvalidCastException] {
    $NetBeans = (& reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall" | ?{$_ -match 'nbi\-'})
    $NetBeans | %{ If (Get-Item ($_ -Replace 'HKEY_LOCAL_MACHINE','HKLM:') -ea 0).Property -contains 'NoModify') { & reg add $_ /v NoModify /t REG_DWORD /d 0x1 /f | Out-Null } }
}

答案4

我无法在 Windows 10 上使用 Inny 的答案。使用 Inny 的代码并进行修改后,我让它工作了。我希望这能帮助别人。

## Check for and fix known exception where broken registry entry breaks Uninstall querying

https://issues.apache.org/jira/browse/NETBEANS-2523

尝试 { Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall*,HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall* -ea 0 | Select-Object DisplayName、DisplayVersion、Publisher、InstallDate |export-csv -Path c:\uninstall_3264bit_20240423.csv -NoTypeinformation

} 捕获 [System.InvalidCastException] { $NetBeans = (® query "HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall" | ?{$_ -match'nbi-'}) $NetBeans | %{ 如果 ((Get-Item ($_ -Replace'HKEY_LOCAL_MACHINE','HKLM:') -ea 0).Property -contains'NoModify') {® add $_ /v NoModify /t REG_DWORD /d 0x1 /f | Out-Null } } }

相关内容