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