web-dev-qa-db-ja.com

vbscriptとnullのチェック

以下の「If(IsNull(value))then」の行で、私のコードは正しいですか?レジストリキーが存在するかどうかを確認し、存在しない場合はWebページを表示したいと思います。

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
10
Steve Wood

すべての変数がバリアントであるVBScriptでは、変数はEMPTYまたはNULLの2つの特別な値のいずれかになります。 EMPTYは初期化されていない値を持つ変数として定義されていますが、NULLは有効なデータを含まない変数です。

変数、つまり「値」がNULLまたはEMPTYかどうかをテストする場合は、次のifステートメントを使用します。

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

RegReadがエラーをスローした場合、valueは初期化されません。初期化されていない変数の値はEmptyではなくNullです。したがって、次の行を追加する必要があります

value = Null

Dimステートメントの後。それ以外の場合、IsNullは常にFalseを返します。

5
user128300

「Null」または「Nothing」の意味ですか?

VBScriptでは、Nothingは値(またはnullポインター)がないことを意味します。 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
3
Kilanash

これがビジネス上の問題に対する私の解決策です。彼らは、USBを読み取り専用にして、サムドライブでデータが流れ出ないようにしたいと考えていました。 pingを実行して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 doesn't exist."
        fnReadKeyValue = "FAIL"
    else
        fnReadKeyValue = strValue
    end if

End Function
0
gWaldo