0

我创建的是一个脚本,它从计算机中提取戴尔服务代码、用户名和计算机名,并将该信息编译成 .csv 文件。该脚本将通过 Active Directory 登录脚本实现,因此最终用户无需执行任何操作。

我遇到的问题是,每次有人登录时,它都会收集他们的信息,并将其添加到列表中。这意味着我的列表可能只有两个反复登录计算机的人。

我希望脚本在 .csv 文件中搜索收集的特定数据,如果该数据存在,则不输入。

我到目前为止的代码是这样的:

'Get Dell Service Tag Info
set ProSet = GetObject("winmgmts:").InstancesOf("Win32_BIOS")
Set ProSet1 = GetObject("winmgmts:").InstancesOf("Win32_SystemEnclosure")
For each Pro in ProSet
  For each Pro1 in ProSet1
    ServiceTag=Pro.SerialNumber
    exit for
  Next
  exit for
Next

'get username and computername, could also be asked in a batch
Set oShell     = WScript.CreateObject("WScript.Shell")
Set oShellEnv  = oShell.Environment("Process")
sComputerName  = oShellEnv("ComputerName")
sUsername      = oShellEnv("username")

dim filesys, filetxt, getname, path
Set filesys = CreateObject("Scripting.FileSystemObject")
Set filetxt = filesys.OpenTextFile("\\xx.xx.xx.xx\Gathering\DataLog.csv", 8, True, -2)
path = filesys.GetAbsolutePathName("\\xx.xx.xx.xx\Gathering\DataLog.csv")
getname = filesys.GetFileName(path)
filetxt.WriteLine sUsername & ", " & sComputerName & ", " & ServiceTag
filetxt.Close

这是基本脚本,没有条目检查器。

至于条目检查器,这是我尝试过的,但似乎不起作用:

Set objFSO = CreateObject("Scripting.Dictionary")
Set objFile = objFSO.OpenTextFile ("\\xx.xx.xx.xx\Gathering\Dictionary.txt", 8, True)
' Make comparisons case insensitive.
objList.CompareMode = vbTextCompare

' ... code to read user name and assign to variable strNameOfUser.

If (objList.Exists(strNameOfUser) = False) Then
    ' Add this user to the dictionary object.
    objList(strNameOfUser) = True
    ' Log this unique user name.
    objFile.WriteLine strNameOfuser
End If

任何帮助表示赞赏!谢谢!

4

1 回答 1

1

(1)您的代码搞砸了:您将字典存储在 objFSO 中,然后尝试调用 objFSO.OpentextFile()

(2) VBScript 不能读取附加到文件;所以 ForAppending (8) 不起作用;您必须先读取打开文件,收集信息,关闭它,追加打开并追加新的用户信息(如有必要)

(3) 使用字典不必要地复杂:要填充字典,您必须从头到尾读取文件,然后才能询问字典是否存在特定用户。虽然只是逐行读取文件,但您可以在找到用户后立即中断读取 - 然后关闭 - 打开 & 附加 - 关闭 - 完成。

更新

代码中的第(3)项:

  Dim goFS    : Set goFS    = CreateObject( "Scripting.FileSystemObject" )
  Dim tsUsers : Set tsUsers = goFS.OpenTextFile(sFSpec, ForReading, True)
  Dim bFound  : bFound      = False
  Do Until tsUsers.AtEndOfStream
     If 1 = Instr(tsUsers.ReadLine(), sUser) Then
        bFound = True
        Exit Do
     End If
  Loop
  tsUsers.Close
  If Not bFound Then
     Set tsUsers = goFS.OpenTextFile(sFSpec, ForAppending, False)
     tsUsers.WriteLine sUser
     tsUsers.Close
  End If

Because I'm a pessimistic worrier: How do you plan to cope with more than one user logging in and write-access the file at the same time?

于 2012-06-21T15:01:36.353 回答