变量 = 使用 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
只能控制 终止 错误,并使用空 catch
块 terminating 错误相当于将 -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
。
我正在尝试查找是否存在特定注册表 属性,如果存在,则将变量设置为该值。我将执行一个 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
只能控制 终止 错误,并使用空 catch
块 terminating 错误相当于将 -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
。