为什么异常没有让我进入 catch 块?
Why does the exception not get me in the catch block?
我正在查询一些服务信息。有时应用程序的安装程序无法正确安装,因此注册表不包含服务条目。我想找出哪些安装程序步骤正确执行,即使在没有正确登录安装程序的系统上也是如此。
如果 MyService
不存在,下面的脚本不会转到 catch
块,即使 exception handling documentation 表明一个简单的 catch
应该足够了:
try {
$path = 'hklm:\SYSTEM\CurrentControlSet\services\MyService'
$key = Get-Item $path
$namevalues = $key | Select-Object -ExpandProperty Property |
ForEach-Object {
[PSCustomObject] @{
Name = $_;
Value = $key.GetValue($_)
}
}
$namevalues | Format-Table
}
catch {
$ProgramFilesX86 = [System.Environment]::GetFolderPath("ProgramFilesX86");
$ProgramFiles = [System.Environment]::GetFolderPath("ProgramFiles");
Write-Host $ProgramFilesX86
Write-Host $ProgramFiles
}
为什么会这样,我应该如何强制它在 catch
中结束?
这是 PowerShell 输出的内容:
Get-Item : Cannot find path 'HKLM:\SYSTEM\CurrentControlSet\services\MyService' because it does not exist.
At C:\Users\Developer\...\GetMyServiceInfo.ps1:17 char:12
+ $key = Get-Item $path
+ ~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (HKLM:\SYSTEM\Cu...vices\MyService:String) [Get-Item], ItemNotFoundException
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetItemCommand
强制终止错误:
$key = Get-Item $path -ErrorAction Stop
这样它会抛出并抓住它。
Microsoft 官方文档的说明和链接:
-ErrorAction
is a Common Parameter 可应用于任何 PowerShell 命令
-ErrorAction
的默认值是 Continue
,它首先防止抛出异常。
- 您可以使用 Preference Variable named
$ErrorActionPreference
配置全局 -ErrorAction
设置以覆盖此默认值。
我正在查询一些服务信息。有时应用程序的安装程序无法正确安装,因此注册表不包含服务条目。我想找出哪些安装程序步骤正确执行,即使在没有正确登录安装程序的系统上也是如此。
如果 MyService
不存在,下面的脚本不会转到 catch
块,即使 exception handling documentation 表明一个简单的 catch
应该足够了:
try {
$path = 'hklm:\SYSTEM\CurrentControlSet\services\MyService'
$key = Get-Item $path
$namevalues = $key | Select-Object -ExpandProperty Property |
ForEach-Object {
[PSCustomObject] @{
Name = $_;
Value = $key.GetValue($_)
}
}
$namevalues | Format-Table
}
catch {
$ProgramFilesX86 = [System.Environment]::GetFolderPath("ProgramFilesX86");
$ProgramFiles = [System.Environment]::GetFolderPath("ProgramFiles");
Write-Host $ProgramFilesX86
Write-Host $ProgramFiles
}
为什么会这样,我应该如何强制它在 catch
中结束?
这是 PowerShell 输出的内容:
Get-Item : Cannot find path 'HKLM:\SYSTEM\CurrentControlSet\services\MyService' because it does not exist.
At C:\Users\Developer\...\GetMyServiceInfo.ps1:17 char:12
+ $key = Get-Item $path
+ ~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (HKLM:\SYSTEM\Cu...vices\MyService:String) [Get-Item], ItemNotFoundException
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetItemCommand
强制终止错误:
$key = Get-Item $path -ErrorAction Stop
这样它会抛出并抓住它。
Microsoft 官方文档的说明和链接:
-ErrorAction
is a Common Parameter 可应用于任何 PowerShell 命令-ErrorAction
的默认值是Continue
,它首先防止抛出异常。- 您可以使用 Preference Variable named
$ErrorActionPreference
配置全局-ErrorAction
设置以覆盖此默认值。