在我的大多数VBscripts(.vbs文件)的顶部,我有以下代码:
Option Explicit
Const ForReading = 1
Dim objFSO, objFile
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("Z:\somepath\somefile.vbs", ForReading)
Execute objFile.ReadAll()
此代码允许我将另一个vbs文件用作库。在这种情况下,somefile.vbs
将是我的库,并且定义了从脚本中调用的所有子函数和调用上述代码(我称之为调用脚本)。
此问题:每隔一段时间,其中一个脚本似乎会删除Z:\somepath\somefile.vbs
中的代码(调用脚本读取的库脚本)。
我认为这是因为如果我的“任务管理器进程”选项卡中列出了wscript.exe
,并且当我再次打开Z:\somepath\somefile.vbs
时几乎立即从备份位置还原Z:\somepath\somefile.vbs
文件,该文件中没有代码。但是如果我杀了wscript.exe
进程,文件就可以了。我无法重现这种行为,因为它只会在我们的网络出现某种打嗝时发生(我认为)。
我首先想到的是当我使用这一行时create
设置错误:
Set objFile = objFSO.OpenTextFile("Z:\somepath\somefile.vbs", ForReading)
但根据此链接,默认create
值应为false:
https://msdn.microsoft.com/en-us/library/aa265347(v=vs.60).aspx
请注意,巧合的是,我还在文件objFile
中使用objFSO
和somefile.vbs
个变量来处理与我在调用脚本中所做的事情无关的事情。例如,objFile
文件中的somefile.vbs
具有完全不同的名称和位置,并以这种方式创建:
Set objFile = objFSO.OpenTextFile("z:\differentpath\differentname.vbs", ForAppending, True)
我猜这是问题,但我不明白。 有人可以对此有所了解吗? create
或append
设置是否会在调用脚本中重置?这有什么作用?
我不知道还能做什么我将somefile.vbs
文件中的变量名称更改为oFSO, oFile
,而在调用脚本中,它们仍然是objFSO, objFile
。我还更改了调用脚本中的代码行,以便为false
设置包含create
,如下所示:
Set objFile = objFSO.OpenTextFile("Z:\somepath\somefile.vbs", ForReading,false)
答案 0 :(得分:1)
从https://ss64.com/vb/execute.html
了解到Execute接受一组语句并在本地范围内执行它们,ExecuteGlobal在全局范围内执行它们。
但是,如果在过程之外(即在全局范围内)调用相同的Execute语句,它不仅会继承全局范围内的所有内容,而且还可以从任何地方调用它,因为它的上下文是全局的。 / p>
如果您将Execute表单调用为过程,问题是否仍然存在?
答案 1 :(得分:1)
走出困境(因为你只发布了部分代码)我会假设你在阅读后没有明确关闭你的库脚本,所以你的主脚本会保持文件打开直到它终止。在objFile.Close
语句后添加一行Execute
,或者(更好)更改
Set objFile = objFSO.OpenTextFile("Z:\somepath\somefile.vbs", ForReading)
Execute objFile.ReadAll()
到
code = objFSO.OpenTextFile("Z:\somepath\somefile.vbs").ReadAll
Execute code
或只是
Execute objFSO.OpenTextFile("Z:\somepath\somefile.vbs").ReadAll
以便在读取文件后自动关闭。