【发布时间】:2016-01-29 19:11:31
【问题描述】:
一直在编写一个脚本,用于显示和记录最终用户许可协议的接受情况,以便在 Active Directory 上使用。它被写入一个 .hta 文件,并且大部分使用 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 个月。
编辑:大多数问题现在都已修复,但我遇到了一个以前没有出现的非常奇怪的问题。在 Logon 方法中创建的 CSV 文件中,它应该写入 {username},{date},{version number},但它会将随机亚洲字符写入文件。
【问题讨论】:
-
您意识到
Dim variable = something在VBScript 中的语法不正确,除非您使用这个小作弊Dim variable : variable = something,否则您不能将Dim和分配在同一行。您在代码中有很多它们,但是因为您设置了On Error Resume Next,它们将被忽略并且下一行将尝试运行。此外OpenTextFile()文件需要物理路径而不是虚拟路径,因此也会出错。就我个人而言,我会注释掉On Error Resume Next,直到你的脚本表现得如你所愿。 -
您还混合了变量和对象变量赋值,
Set仅用于分配对象的实例。 VBScript 中的字符串不属于对象实例,而是简单类型。事实上,End of Statement Expected实际上可能来自您当前遇到的十几个或更多错误。 -
@Lankymart By Physical path 你的意思是我需要完整的路径示例:“C:\..\..\store\directory.txt”?
-
是的,您在那里使用的路径样式(就 Windows 而言) 是 Web 服务器所期望的虚拟路径,而不是本地/物理路径。只是写
"/store/directory.txt"FileSystemObject不知道它的工作目录是什么,你总是需要指定一个完整的路径。注释掉On Error Resume Next应该会突出显示其中的大部分内容供您深入研究。 -
不确定为什么要缩进,但每个缩进都有自己的,通常缩进表示代码在过程、条件语句或循环内。在声明之后添加额外的缩进没有任何作用。