VBScript 中的函数 returns 一个语法错误,当我知道该函数在另一个脚本版本中有效时

Function in VBScript returns a syntax error, when I know the function works in another script version

我有一个脚本可以查询单台计算机的 WMI 以了解每个登录计算机的用户以及 returns 用户上次登录的月、日、年、小时、分钟、秒。原始脚本工作正常,使用在新版本中导致语法错误的函数。

我添加了代码,通过读取 servers.txt 文件对计算机列表进行相同的脚本查询。在启动我用来将 sTime 转换为人类可读形式的函数的行中,代码一直失败并出现一般语法错误。我取出函数,脚本运行正常,但最后登录时间的格式为“20150323132329.000000-420”。

不是 VBScript 专家我不明白语法在一个版本的脚本中运行良好但完全相同的函数在不同版本的脚本中失败并出现语法错误时有什么问题。

我希望有人会好心帮助我找出我做错了什么,理解我不是一个强大的脚本编写者。

同样,如果我完全删除函数并更改行 objFile.WriteLine " Last Logon: " & ConvertTime(objItem.LastLogon)objFile.WriteLine " Last Logon: " & objItem.LastLogon 脚本运行完全符合我的预期,但我丢失了上次登录时间的格式。

这是脚本:

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.

将函数声明移动到模块级别,在任何 IfDo 和其他函数之外。

附带说明一下,该函数可能没有按照您的想法执行(您是指 ConvertTime="Unknown" 而不是 sTime="Unknown" 吗?)。