Vbscript и проверка на нуль

В строке "If (IsNull (значение)), то" ниже мой код правильный? Я хочу проверить, существует ли раздел реестра, а затем нет веб-страницы.

Option Explicit
On error resume next
Dim SysVarReg, Value
Set SysVarReg = WScript.CreateObject("WScript.Shell")
value = SysVarReg.RegRead ("HKCU\Software\test\FirstLogonComplete")

If (IsNull(value)) then

    Set WshShell = WScript.CreateObject("WScript.Shell") 
    WshShell.Run "c:\Program Files\Internet Explorer\iexplore.exe https://intranet/start.htm"

    Dim SysVarReg2, Value2
    Value2 = "TRUE"
    Set SysVarReg2 = WScript.CreateObject("WScript.Shell")
    SysVarReg2.RegWrite "HKCU\Software\test\FirstLogonComplete", Value2

else
    wscript.echo "Already logged on"
end if

Ответ 1

Если RegRead выдает ошибку, то value не инициализируется; неинициализированная переменная имеет значение Empty, а не Null. Поэтому вы должны добавить строку

value = Null

после заявления Dim. В противном случае, IsNull всегда будет возвращать False.

Ответ 2

В VBScript, где все переменные являются вариантами, переменные могут быть одним из двух специальных значений: EMPTY или NULL. EMPTY определяется как переменная с неинициализированным значением, тогда как NULL - это переменная, которая не содержит достоверных данных.

Если вы хотите проверить, является ли переменная "значение" NULL или EMPTY, используйте следующую инструкцию if:

If IsNull(value)  Or  IsEmpty(value) Then
   '...do something
End If

Ответ 3

Вы имеете в виду "Ноль" или "Ничего"?

В VBScript Nothing означает отсутствие значения (или нулевого указателя). Null используется для представления значений NULL из базы данных.

Смотрите эту ссылку для получения дополнительной информации.

Также см. этот пример, чтобы узнать, как определить, существует ли раздел реестра:

Const HKLM = &H80000002
Set oReg =GetObject("Winmgmts:root\default:StdRegProv")

sKeyPath = "Software\Microsoft\Windows\CurrentVersion"
If RegValueExists(HKLM, sKeyPath, sValue) Then
  WScript.Echo "Value exists"
Else
  WScript.Echo "Value does not exist"
End If

Function RegValueExists(sHive, sRegKey, sRegValue)
  Dim aValueNames, aValueTypes
  RegValueExists = False
  If oReg.EnumValues(sHive, sKeyPath, aValueNames, aValueTypes) = 0 Then
    If IsArray(aValueNames) Then
      For i = 0 To UBound(aValueNames)
        If LCase(aValueNames(i)) = LCase(sRegValue) Then
          RegValueExists = True
        End If
      Next
    End If
  End If
End Function

Ответ 4

Это мое решение бизнес-проблемы. Они хотели сделать USB доступным только для чтения, чтобы данные не могли перемещаться на флэш-накопителях. После проверки связи и подключения к WMI я должен был определить, существует ли ключ, и было ли установлено значение. На пару тысяч компьютеров.

keyExists = fnReadKeyValue()

'======================================
'======================================


Function fnReadKeyValue()
    '   ' EXAMPLE VALUES
    '   const HKEY_LOCAL_MACHINE = &H80000002
    '   strComputer = "."
    '   strKeyPath = "SYSTEM\CurrentControlSet\Control\StorageDevicePolicies"
    '   strEntryName = "WriteProtect"

    Set objReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _
        strComputer & "\root\default:StdRegProv")

    objReg.GetDWordValue HKEY_LOCAL_MACHINE, strKeyPath, strEntryName, strValue
    if IsNull(strValue) then
        objLogFile.WriteLine "That registry value does not exist."
        fnReadKeyValue = "FAIL"
    else
        fnReadKeyValue = strValue
    end if

End Function