2
“预期的声明结束”被编写脚本用于显示和记录验收使用了Active Directory中的最终用户许可协议。它被写入一个.hta文件并且大部分使用VBScript。在VBScript文件
我碰到了很多,我迄今固定的问题,但是这最后一个人把我难住了。
当文件被运行它给了我一个
“预期的声明结束”
错误的脚本的35行是:
27 For Each ln in dict.Items
28 If ln = UserName Then
29 wasFound = true
30 End If
31 Next
32 If wasFound Then
33 WScript.Quit()
34 Else
35 Call DisableTaskMgr
36 Set objWMIService = GetObject("winmgmts:\\" & strComputer & wmiNS)
37 Set colItems = objWMIService.ExecQuery(wmiQuery)
38 For Each objItem in colItems
39 objItem.terminate(1)
40 Next
41 End If
我有不知道这是什么要求我改变。
完整的文件可以发现here
'On Error Resume Next
Set objShell = CreateObject("WScript.Shell")
Set fso = CreateObject("Scripting.FileSystemObject")
System = "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System\"
dim currentDir : currentDir = objShell.CurrentDirectory
UserName = objShell.ExpandEnvironmentStrings("%USERNAME%")
pathToDirectory = currentDir & "/store/directory.txt"
wasFound = false
row = 0
Version = "V1.0"
Set dict = CreateObject("Scripting.Dictionary")
Set directoryfile = fso.OpentextFile(pathToDirectory, 1)
dim strComputer : strComputer = "."
dim wmiNS : wmiNS = "/root/cimv2"
dim wmiQuery : wmiQuery = "Select processID from win32_process where name = 'explorer.exe'"
dim objWMIService
dim colItems
dim objItem
dim strOUT
Do Until directoryfile.AtEndOfStream
line = directoryfile.Readline
dict.Add row, line
row = row + 1
Loop
directoryfile.Close
For Each ln in dict.Items
If ln = UserName Then
wasFound = true
End If
Next
If wasFound Then
window.close
Else
Call DisableTaskMgr
Set objWMIService = GetObject("winmgmts:\\" & strComputer & wmiNS)
Set colItems = objWMIService.ExecQuery(wmiQuery)
For Each objItem in colItems
objItem.terminate(1)
Next
End If
sub DisableTaskMgr
objShell.RegWrite System, "REG_SZ"
objShell.RegWrite System & "/DisableTaskMgr", 1, "REG_DWORD"
end sub
sub EnableTaskMgr
objShell.RegWrite System, "REG_SZ"
objShell.RegWrite System & "/DisableTaskMgr", 0, "REG_DWORD"
end sub
sub RestartExplorerExe
objShell.Run "explorer.exe"
end sub
sub Logon
Call EnableTaskMgr
If Not (fso.FileExists(currentDir & "/store/" & LCase(UserName) & ".csv")) Then
Set objFile = fso.CreateTextFile(currentDir & "/store/" & LCase(UserName) & ".csv", 2, True)
objFile.close
Else
End If
Set ObjOpenFile = fso.OpenTextFile(currentDir & "/store/" & UserName & ".csv", 8, -2)
objOpenFile.WriteLine(UserName & "," & Now & "," & Version)
objOpenFile.Close
Set objOpenFile = fso.OpenTextFile(currentDir & "/store/directory.txt", 8, -2)
objOpenFile.WriteLine(UserName)
objOpenFile.Close
Call RestartExplorerExe
window.close
end sub
sub Logoff
objShell.Run "shutdown /l"
end sub
如果你们发现代码中的其他任何愚蠢的错误,我会很感激那些也一直对这个剧本3个月左右的帮助。
编辑:现在大部分问题已得到修复,但我遇到了,这不是前出现一个非常奇怪的问题。在创建到登录方法中的CSV文件内部,它应该写{用户名},{日期},{版本号},但是它将随机的亚洲字符写入文件中。
你会意识到,'昏暗的变量= something'是不正确的语法在VBScript中,你不能'Dim'并在同一行分配,除非你使用这个小骗子'昏暗变量:变量= something'。你在代码中有很多,但是因为你有'On Error Resume Next'集合,它们将被忽略,下一行将尝试运行。另外'OpenTextFile()'文件需要一个物理路径而不是虚拟路径,这样也会出错。就我个人而言,我会评论'On Error Resume Next',直到您的脚本按照您的预期行事。 – Lankymart
您还在混合变量和对象变量赋值,“Set”仅用于指定对象的实例。 VBScript中的字符串不是分类为对象实例,而是简单类型。事实是'预期结束语'实际上可能来自您目前拥有的十几个或更多错误。 – Lankymart
@Lankymart通过物理路径你的意思是我需要有完整路径的例子:“C:\ .. \ .. \ store \ directory.txt”? –