连续运行VBScript

时间:2019-07-15 21:26:32

标签: vbscript

我在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 

我希望每个实例都等到第一个过程完成。

1 个答案:

答案 0 :(得分:1)

您需要的称为semaphoremutex。本质上,这是一次只能由一个进程或线程持有的资源。在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