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
.
将函数声明移动到模块级别,在任何 If
、Do
和其他函数之外。
附带说明一下,该函数可能没有按照您的想法执行(您是指 ConvertTime="Unknown"
而不是 sTime="Unknown"
吗?)。
我有一个脚本可以查询单台计算机的 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
.
将函数声明移动到模块级别,在任何 If
、Do
和其他函数之外。
附带说明一下,该函数可能没有按照您的想法执行(您是指 ConvertTime="Unknown"
而不是 sTime="Unknown"
吗?)。