我正在尝试查找特定注册表属性的存在,如果存在,请将变量设置为该值。我将执行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东西,但是好主啊,很丑。
答案 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
。