我在Outlook规则上启动了一个批处理语句,该语句启动了一个VBScript,然后根据发件人和主题标题启动了其他VBScript。如果来自同一发件人的两封电子邮件同时进入收件箱,它将正确启动第一个实例。但是,第二个将开始并返回错误,指出“权限被拒绝”。我想连续运行每封电子邮件。
我已经尝试过睡眠功能和其他时间延迟,但是由于数据大小,查询时间不一致。
这是我一直在使用的基本脚本。
Set olApp = CreateObject("Outlook.Application")
Set olMAPI = olApp.GetNameSpace("MAPI")
Set oFolder = olMAPI.Folders("FieldFinanceAutomatedReports@xxxxx.com").Folders("Inbox").Folders("Requested Report People")
Set allEmails = oFolder.Items
Set firstemail = allEmails.GetLast
unreadCount = 0
For Each email In oFolder.Items
If email.Unread = True Then
If email.Sender= "Sender_of_email@email.com" Then
Set objcreate = CreateObject("Scripting.FileSystemObject")
Set objread = objcreate.OpenTextFile("C:\path_to_script\script.vbs")
request = objread.ReadAll()
objread.Close
Set objread = Nothing
Execute request
Set request = Nothing
Set objcreate = Nothing
End If
WScript.Sleep 500
If email.Sender = "Another_Sender_of_email@email.com" Then
Set objcreate = CreateObject("Scripting.FileSystemObject")
Set objread = objcreate.OpenTextFile("C:\path_to_script\another_script.vbs")
another_request = objread.ReadAll()
objread.Close
Set objread = Nothing
Execute another_request
Set another_request = Nothing
Set objcreate = Nothing
End If
WScript.Sleep 500
unreadCount = unreadCount + 1
End If
Next
我希望每个实例都等到第一个过程完成。
答案 0 :(得分:1)
您需要的称为semaphore或mutex。本质上,这是一次只能由一个进程或线程持有的资源。在VBScript中,您可以通过尝试create a (temporary) file来实现。这样做的第一个过程将获胜,但随后的尝试将失败,因为该文件已存在。
Set sh = CreateObject("WScript.Shell")
Set fso = CreateObject("Scripting.FileSystemObject")
filename = sh.ExpandEnvironmentStrings("%TEMP%\mutex.txt")
'this will throw an error if the file is already opened
Set f = fso.OpenTextFile(filename, 2, True)
请注意,您需要打开文件进行写入(第二个参数设置为2)。打开它进行读取(第二个参数设置为1)是不够的。
循环运行该操作,您可以等待另一个过程完成并释放互斥锁。
Set sh = CreateObject("WScript.Shell")
Set fso = CreateObject("Scripting.FileSystemObject")
filename = sh.ExpandEnvironmentStrings("%TEMP%\mutex.txt")
On Error Resume Next
Do
Err.Clear
Set f = fso.OpenTextFile(filename, 2, True)
If Err Then WScript.Sleep 100
Loop While Err
On Error Goto 0
请确保在脚本离开关键部分(或终止)时删除文件,否则其他脚本稍后可能无法获取互斥量。一种简便的方法是将互斥锁实现为一个类。这样,即使脚本意外终止,它也会自动清除。
Class Mutex
Private f_
Private Sub Class_Initialize
Set sh = CreateObject("WScript.Shell")
Set fso = CreateObject("Scripting.FileSystemObject")
filename = sh.ExpandEnvironmentStrings("%TEMP%\mutex.txt")
On Error Resume Next
Do
Err.Clear
Set f_ = fso.OpenTextFile(filename, 2, True)
If Err Then WScript.Sleep 100
Loop While Err
On Error Goto 0
End Sub
Private Sub Class_Terminate
f_.Close
End Sub
End Class
您可以像下面这样在代码中使用Mutex
类:
Set m = New Mutex 'acquire mutex
'...
'critical section goes here
'...
Set m = Nothing 'release mutex