我编写了一个脚本来检查Windows x64主机密钥中Firefox的文件路径。它具有一个try catch块,在括号中具有完全限定的错误ID。
尽管错误消息与代码中的内容相同,但未捕获到错误。
$program = "FireFox"
$filepath = "HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall"
$FPF = $filepath + "\" + $program
try { Get-ChildItem $FPF}
catch [PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand] {
if ($_.Exception.Message -match "Get-ChildItem : Cannot find path*") {
Write-Host "false"}
}
出现的全部错误是
Get-ChildItem : Cannot find path 'HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\FireFox' because it does not exist.
At line:7 char:7
+ try { Get-ChildItem $FPF}
+ ~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (HKEY_LOCAL_MACH...install\FireFox:String) [Get-ChildItem], ItemNotFoundException
+ FullyQualifiedErrorId :PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand
可能是什么问题?
答案 0 :(得分:1)
您已经发现,您可以通过使用Test-Path
cmdlet预先确定给定路径是否存在,以及< em> existence 是您所关心的,就足够了:if (Test-Path $FPF) { ... }
一般来说,但是,即使路径存在,您在遍历上仍然可能会遇到错误。
要解决您的原始尝试:存在两个基本问题:
正如Matt在评论中指出的, Get-ChildItem
未找到给定路径会导致非终止错误,而{{1 }} / try
仅适用于终止错误。
不过,您可以通过在命令中添加通用参数catch
来将非终止错误提升为终止错误。
有关PowerShell错误类型及其处理的摘要,请参见this GitHub post。
要限定条件-ErrorAction Stop
处理程序,您必须使用异常类型文字,例如catch
,不是错误记录的[System.Management.Automation.ItemNotFoundException]
属性(例如.FullyQualifiedErrorId
)的值
PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand
这是基于上述内容的代码的修订版:
$Error[0].Exception.GetType().FullName