变量=使用try / catch

时间:2019-06-23 18:51:17

标签: powershell try-catch scriptblock

我正在尝试查找特定注册表属性的存在,如果存在,请将变量设置为该值。我将执行If / Then / ElseIf序列,所以我不想将小洞内容包装在Try / Catch中,以解决PS5.1 Get-ItemPropertyValue不支持{{1} },所以我真的想将值设置为代码块的执行,该代码块包含带空catch的try / catch,类似这样的内容...

-errorAction:silentlyContinue

我觉得这是有可能的,我很亲密,只是有些细微的差别。也许这是一个愚蠢的想法,并且有更好的方法? 它们将try / catch保留在if / then / else中的关键原因是因为我将寻找AdskProductCode而不是寻找该属性,而我会寻找AdskPackageCode,并且在每种情况下,我对值的处理都不同。如果try / catch包装了iff,则找不到AdskProductCode会使我完全失望,如果寻找AdskPackageCode,我将永远无法找到其他人。否则将至少有一个最终结局,如果可能,则可能还有另一个结局,因此仅在捕获中查找AdskPackageCode是行不通的。我可以级联try / catch东西,但是好主啊,很丑。

1 个答案:

答案 0 :(得分:0)

  

解决PS5.1中的Get-ItemPropertyValue不支持-errorAction:silentlyContinue

的事实

实际上,自PowerShell Core 7.0.0-preview.1 / Windows PowerShell v5.1起,Get-ItemPropertyValue意外报告了一个语句终止,而不是一个非终止错误-只有后一种错误可以通过常见的
-ErrorAction参数
进行控制。

在{{3}中报告了这种有问题的行为-限于注册表 value (与包含 key 相对的情况)不存在的情况}。


try / catch只能控制终止错误,并且为终止使用空的catch块错误等于将-ErrorAction Ignore传递给cmdlet会产生非终止错误。

this GitHub issue指出,您唯一的问题是您将try / catch语句错误地包装在@{ ... }中,该语句是一个哈希表文字,它本身导致了一个语句-终止错误。

您可能会想到子表达式运算符$( ... ),在这种情况下可以使用,但是不需要使用它,因此以下内容就足够了:

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 不存在);要也忽略密钥路径的不存在,请使用-ErrorAction Ignore
  • 以上假设没有严格模式或至多严格模式版本1都有效。
  • 相反,如果生效的是Set-StrictMode -Version 2或更高版本,请不要使用直接属性访问,而应使用管道传递到Select-Object -ErrorAction Ignore -ExpandProperty AdskProductCode