Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function 当我知道VBScript中的函数在另一个脚本版本中工作时,该函数返回语法错误_Function_Syntax_Vbscript - Fatal编程技术网

Function 当我知道VBScript中的函数在另一个脚本版本中工作时,该函数返回语法错误

Function 当我知道VBScript中的函数在另一个脚本版本中工作时,该函数返回语法错误,function,syntax,vbscript,Function,Syntax,Vbscript,我有一个脚本,可以为每个登录到计算机的用户查询一台计算机的WMI,并返回用户上次登录的月、日、年、时、分、秒。原始脚本工作正常,使用了导致新版本中语法错误的函数 我添加了代码,通过读取servers.txt文件对计算机列表进行相同的脚本查询。代码一直失败,在启动我用来将sTime转换为人类可读形式的函数的那一行出现了一个通用语法错误。我取出了函数,脚本运行正常,但最后一次登录时间的格式是20150323132329.000000-420 作为一名VBScript专家,我不明白语法有什么问题,当它

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

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

作为一名VBScript专家,我不明白语法有什么问题,当它在一个版本的脚本中运行良好,但在另一个版本的脚本中完全相同的函数由于语法错误而失败时

我希望有人能善意地帮助我找出我做错了什么,明白我不是一个优秀的脚本编写者

同样,如果我完全取出函数并更改行objFile.WriteLine Last Logon:&ConvertTimeobjItem.LastLogon 到objFile.WriteLine上次登录:&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)中有函数声明

将函数声明移动到模块级,在任何Ifs、Dos和其他函数之外


另一方面,该函数可能没有实现您认为的功能您是说ConvertTime=Unknown而不是sTime=Unknown?

这就是我感到困惑的地方,如何将该函数移到Do…循环之外,并且仍然对servers.txt中的每台服务器进行解析?因为函数通常是这样工作的-您在一个地方声明它们,在另一个地方使用它们。您正在从Do循环内的For循环调用函数。如果你需要把函数放在循环中,你会关心为什么它能工作,为什么在For循环之外声明。我不理解你的问题。将功能块移到Do块外。为了便于阅读,将其作为文件中的第一件或最后一件事。把剩下的留在Do块中。