2012-04-04 11 views
1

私は数日間、頭を頭につけていましたが、私のコードで何が問題なのかは分かりません。私はそれがかなり単純だと確信していますが、それを見ることはできません。私はマシンにログオンしているユーザーのリストと時刻を返そうとしています。環境がロックダウンされているため、私はレジストリを読まなければなりませんでした。関数から変数を返す

Option Explicit 
Const HKEY_LOCAL_MACHINE = &H80000002 

Dim oNet, WMI, strComputer, tz, os, objRegistry, strKeyPath, strSubPath, strValueName, strValue, arrSubkeys, objSubKey, strSID, strUser, objReg, lngHighValue, lngLowValue, Return, strReturn, NanoSecs, DT 
Set oNet = CreateObject("WScript.Network") 
Set WMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2") 
strComputer = oNet.Computername 

tz = 0 
For Each os In GetObject("winmgmts:").InstancesOf ("Win32_OperatingSystem") 
    tz = os.CurrentTimeZone 
    Exit For 
Next 

'Set objRegEx = CreateObject("VBScript.RegExp") 
'objRegEx.Global = True 
'objRegEx.IgnoreCase = True 
'objRegEx.Pattern = "default|all users|administrator|localservice|networkservice|ueit-admn-[0-9]|3rd-admn-[0-9]|systemprofile" 

Set objRegistry=GetObject("winmgmts:\\" & _ 
    strComputer & "\root\default:StdRegProv") 

strKeyPath = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" 
objRegistry.EnumKey HKEY_LOCAL_MACHINE, strKeyPath, arrSubkeys 

For Each objSubkey In arrSubkeys 
    strValueName = "ProfileImagePath" 
    strSID = objSubKey 
    strSubPath = strKeyPath & "\" & objSubkey 
    objRegistry.GetExpandedStringValue HKEY_LOCAL_MACHINE,strSubPath,strValueName,strValue 
    'strUser = Replace(strValue,"C:\Documents and Settings\","") 
    'Set colMatches = objRegEx.Execute(strUser) 
    'If colMatches.Count < 1 Then 
    Call ProfileTime(strSID) 
    'WScript.echo ProfileTime 
    'End If 
Next 

Function ProfileTime(strSID) 

Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv" ) 
strKeyPath = "SOFTWARE\MICROSOFT\Windows NT\CurrentVersion\ProfileList\" & strSID 

strValueName = "ProfileLoadTimeHigh" 
Return = objReg.GetDWORDValue(HKEY_LOCAL_MACHINE,strKeyPath,strValueName,lngHighValue) 
strValueName = "ProfileLoadTimeLow" 
Return = objReg.GetDWORDValue(HKEY_LOCAL_MACHINE,strKeyPath,strValueName,lngLowValue) 
If typename(lngHighValue) <> "Null" then 
    NanoSecs = (lngHighValue * 2^32 + lngLowValue) 
    '' /* Returns time in Workstation Timezone */ 
    DT = #1/1/1601# + (NanoSecs/600000000/1440) + (tz/1440) 
    Set ProfileTime = CDate(DT) 
    End If 
End Function 

上記のリターンを走っ

profile.vbs(36, 5) Microsoft VBScript runtime error: Wrong number of arguments or invalid property assignment: 'ProfileTime' 

ビットは、あなたのバグが解決されるまで瞬間

+0

上記のコードには36行がありません。スクリプト全体を投稿して、どれが行番号36であるかを示してください。 – Nilpo

答えて

3
  1. は、on error resume nextを取り除く失いました。
  2. Option Explicitを使用し、すべての変数を宣言します。例えば、strReturnのようなスコープの問題があることがわかります。
  3. VBScriptでどのように関数が値を返すかを調べてみましょう。ヒントではありませんReturn = "my return value"
  4. 関数を呼び出す必要があるので、Call ProfileTime(objsubkey)を使用してください。それ以外の場合は、Subとして扱うことができ、ProfileTime objsubkeyとします。 ProfileTime(objsubkey)を使用すると、「objsubkeyを関数に投げる前に評価する」という意味です。 this blog articleの仕組みを見てください。

これらの手順を実行すると、コードがきれいになり、何が問題になっているかのヒントが得られます。エラーが発生したときに別の方法(=エラーが次に再開するとき)を探し、それが正しく動作することを期待してコードを作成することはできません。また、適切なローンリスト(=オプションの明示、宣言、スコープ)に入れないことであなたの労働者を尊重しないと、彼らはあなたに反抗的になるでしょう。

+0

ポインタメイトに感謝します。私はエラーで削除し、すべての変数を定義しました。関数の値を関数ProfileTimeの名前として返す必要がありますが、現在は "引数の数またはプロパティの割り当てが間違っています"というエラーが返されます。SETを使用してProfileTimeに値を割り当てようとしましたが、同じエラーが発生しています。どのように私は値を返し、このエラーを避けることができますか? – chemist

+0

元の投稿を更新してください。 –

+1

CDataはオブジェクトではなくプリミティブを返すので、ProfileTimeを 'Set'する必要はありません。他のすべてのプリミティブと同じように割り当てることができます。 – AutomatedChaos

関連する問題