变量 = 使用 try/catch 执行的脚本块

Variable = Executed script block with try/catch

我正在尝试查找是否存在特定注册表 属性,如果存在,则将变量设置为该值。我将执行一个 If/Then/ElseIf 序列,所以我不想将漏洞包裹在 Try/Catch 中以解决 PS5.1 Get-ItemPropertyValue 中没有的事实t 支持 -errorAction:silentlyContinue,所以我真的想将值设置为执行包含 try/catch 和空捕获的代码块,像这样...

if ($value = @{try {Get-ItemPropertyValue "Registry::$nameKey" -name:AdskProductCode}catch{}}) {

我觉得这是可能的,而且我很接近,只是缺少一些细微差别。或者这是一个愚蠢的想法,有更好的方法吗? 他们将 try/catch 保留在 if/then/else 中的关键原因是因为我将查找 AdskProductCode 而未找到 属性 我将查找 AdskPackageCode,并且在每种情况下我对值的处理是不同的。如果 try/catch 包装了 iff,那么找不到 AdskProductCode 就会把我完全甩掉,如果要寻找 AdskPackageCode,我永远也不会去其他地方。如果失败,至少会有一个 final else,也许还有另一个 else if,所以简单地在 catch 中寻找 AdskPackageCode 是行不通的。我可以级联 try/catch 东西,但天哪,那太丑了。

to address the fact that in PS5.1 Get-ItemPropertyValue doesn't support -errorAction:silentlyContinue

确实,从 PowerShell Core 7.0.0-preview.1 / Windows PowerShell v5.1 开始,Get-ItemPropertyValue 意外报告 statement-terminating 而不是 non-terminating 错误 - 只有后一种错误可以用常见的
-ErrorAction 来控制参数
.

这种有问题的行为 - 仅限于注册表 value(相对于包含的 key)不存在的情况 -已在 this GitHub issue.

中报告

try / catch 只能控制 终止 错误,并使用空 catchterminating 错误相当于将 -ErrorAction Ignore 传递给 cmdlet 产生 non-terminating 错误。

正如 Mathias R. Jessen 指出的那样,您唯一的问题是您错误地将 try / catch 语句包装在 @{ ... } - 哈希表文字 - 这本身导致statement-terminating 错误。

你可能一直在想 $( ... ),子表达式运算符,它在这种情况下会起作用,但它不是必需的,所以下面的就足够了:

if ($value = try { Get-ItemPropertyValue "Registry::$nameKey" -name:AdskProductCode } catch{}) { ...

即可以直接使用try/catch语句作为表达式,因此将其分配给一个变量。


鉴于 Get-ItemPropertyValue 的行为可能 - 并且有望 - 最终得到修复,我建议采用不同的方法,但是:

改为使用 Get-ItemProperty,并访问结果对象上感兴趣的值名称作为 属性:

if ($value = (Get-ItemProperty "Registry::$nameKey").AdskProductCode) { ...

注:

  • 一般的假设是关键路径 "Registry::$nameKey" 确实存在(即只有注册表 value 可能不存在);要忽略关键路径的 non-existence,请使用 -ErrorAction Ignore.
  • 以上假定没有严格模式或最多严格模式版本 1 有效。
  • 相比之下,如果 Set-StrictMode -Version 2 或更高版本有效,请不要使用直接 属性 访问,而是通过管道连接到 Select-Object -ErrorAction Ignore -ExpandProperty AdskProductCode