【问题标题】:Best way to determine if function call was successful确定函数调用是否成功的最佳方法
【发布时间】:2016-02-14 11:45:39
【问题描述】:

考虑以下 VBScript 示例,它从注册表中读取一个值并将相对路径字符串转换为绝对路径字符串:

On Error Resume Next

Set objShell = CreateObject("WScript.Shell")

strPath = Replace(objShell.RegRead(someRegKey),"\relative path","\\?\Absolute path",1,-1,1)

确定对RegRead() 的调用是否成功的最佳方法是什么?我知道如果注册表项不存在,RegRead() 将引发 Err

  • 在 VBScript 中,如果引发 Err,是否会跳过整行,或者内部调用是否会向外部 Replace() 函数返回 NULL 或一些未定义的值?
  • 如果是后者,Replace() 函数是否也会引发错误,还是只会返回 NULL 或其他什么?
  • Err.Number 是来自RegRead() 调用还是Replace() 调用的失败代码?
  • strPath 的值是多少?它是空字符串、未修改还是未定义?
  • 测试空字符串的最佳方法是什么? If strPath = ""IsEmpty(strPath) 是等效的语句吗?

基本上,如果我在 VBScript 中使用这个结构,简单地检查 Err.Number 的值是否安全?还是我需要测试结果字符串?还是两者兼有?

我试图在我的代码中不要过于冗长,但从更广泛的意义上说,我想了解 VBScript 如何处理这些事情。

【问题讨论】:

  • 整行将被跳过,没有什么可以阻止您将行分解为可管理的块并且仅使用If Err.Number <> 0 Then 检查objShell.RegRead(someRegKey)。但是,请考虑使用 @Ansgar's approach 以获得更强大的解决方案。

标签: string replace vbscript registry


【解决方案1】:

最好的方法是首先不使用RegRead(或嵌套函数/方法调用)。使用 WMI(它将为您提供实际的返回码)并将注册表读取与替换操作分开:

Const HKCU = &H80000001
Const HKLM = &H80000002

Set reg = GetObject("winmgmts://./root/default:StdRegProv")

hive = HKLM
key  = "SOFTWARE\foo"
valueName = "bar"

rc = reg.GetStringValue(hive, key, valueName, value)

If rc <> 0 Then
  WScript.Echo "Error reading " & key & "\" & valueName & ": " & rc
  WScript.Quit 1
End If

strPath = Replace(value, "\relative path", "\\?\Absolute path", 1, -1, 1)

【讨论】:

    猜你喜欢
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    • 2016-09-19
    • 2010-09-17
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    • 2020-03-10
    相关资源
    最近更新 更多