Function 当我知道VBScript中的函数在另一个脚本版本中工作时,该函数返回语法错误
我有一个脚本,可以为每个登录到计算机的用户查询一台计算机的WMI,并返回用户上次登录的月、日、年、时、分、秒。原始脚本工作正常,使用了导致新版本中语法错误的函数 我添加了代码,通过读取servers.txt文件对计算机列表进行相同的脚本查询。代码一直失败,在启动我用来将sTime转换为人类可读形式的函数的那一行出现了一个通用语法错误。我取出了函数,脚本运行正常,但最后一次登录时间的格式是20150323132329.000000-420 作为一名VBScript专家,我不明白语法有什么问题,当它在一个版本的脚本中运行良好,但在另一个版本的脚本中完全相同的函数由于语法错误而失败时 我希望有人能善意地帮助我找出我做错了什么,明白我不是一个优秀的脚本编写者 同样,如果我完全取出函数并更改行objFile.WriteLine Last Logon:&ConvertTimeobjItem.LastLogon 到objFile.WriteLine上次登录:&objItem.LastLogon 脚本完全按照我的预期运行,但随后我丢失了上次登录时的格式 以下是脚本:Function 当我知道VBScript中的函数在另一个脚本版本中工作时,该函数返回语法错误,function,syntax,vbscript,Function,Syntax,Vbscript,我有一个脚本,可以为每个登录到计算机的用户查询一台计算机的WMI,并返回用户上次登录的月、日、年、时、分、秒。原始脚本工作正常,使用了导致新版本中语法错误的函数 我添加了代码,通过读取servers.txt文件对计算机列表进行相同的脚本查询。代码一直失败,在启动我用来将sTime转换为人类可读形式的函数的那一行出现了一个通用语法错误。我取出了函数,脚本运行正常,但最后一次登录时间的格式是20150323132329.000000-420 作为一名VBScript专家,我不明白语法有什么问题,当它
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.CreateTextFile("output.txt", True)
Set objServerlist = objFSO.OpenTextFile("servers.txt", 1)
On Error Resume Next
Do Until objServerList.AtEndOfStream
strComputer = objServerList.ReadLine
Set objWMIService = GetObject _
("winmgmts:{impersonationlevel=impersonate,authenticationLevel=pktPrivacy}!\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_NetworkLoginProfile",,48)
function ConvertTime(sTime)
if (sTime="**************.******+***") then
ConvertTime = "Unknown"
else
if (Trim(sTime)="") then
sTime="Unknown"
else
sYear = Mid(sTime,1,4)
sMonth = Mid(sTime,5,2)
sDay = Mid(sTime,7,2)
sHour = Mid(sTime,9,2)
sMin = Mid(sTime,11,2)
sSec = Mid(sTime,13,2)
end if
ConvertTime = sMonth & "/" & sDay & "/" & sYear & " (" & sHour & ":" & sMin & ":" & sSec & ")"
end if
end function
For Each objItem in colItems
if (objItem.UserType = "Normal Account") then
objFile.WriteLine objItem.Name & vbCrLf
objFile.WriteLine " Last Logon: " & ConvertTime(objItem.LastLogon)
objFile.WriteLine " Number of Logons: " & objItem.NumberOfLogons
if (objItem.Privileges=0) then
objFile.WriteLine " (Guest Account)"
else if (objItem.Privileges=1) then
objFile.WriteLine " (Standard User Account)"
else if (objItem.Privileges=2) then
objFile.WriteLine " (Administrator Account)"
end if
end if
end if
objFile.WriteLine vbCrLf
end if
Next
Loop
我很惊讶这能奏效 虽然可以在模块级代码行之间有函数声明,但不能在控制流块(如Do…Loop)中有函数声明 将函数声明移动到模块级,在任何Ifs、Dos和其他函数之外
另一方面,该函数可能没有实现您认为的功能您是说ConvertTime=Unknown而不是sTime=Unknown?这就是我感到困惑的地方,如何将该函数移到Do…循环之外,并且仍然对servers.txt中的每台服务器进行解析?因为函数通常是这样工作的-您在一个地方声明它们,在另一个地方使用它们。您正在从Do循环内的For循环调用函数。如果你需要把函数放在循环中,你会关心为什么它能工作,为什么在For循环之外声明。我不理解你的问题。将功能块移到Do块外。为了便于阅读,将其作为文件中的第一件或最后一件事。把剩下的留在Do块中。