2013-01-08 32 views
3

我有幾個腳本試圖訪問剪貼板。一次只能有一個腳本可以訪問剪貼板。我的解決方案不起作用。這裏是我實施的解決方案如何使用文件系統作爲信號量

  • 檢查是否存在clipboardLock.txt。
  • - 如果它不存在,則創建它
  • - 如果它確實存在,然後等待3秒至10秒,並檢查它是否存在

這並不能很好的工作--do處理

  • 因爲兩個腳本試圖創建文件並出錯。有沒有一種技術可以保證只有一個腳本可以訪問剪貼板?另外,我沒有訪問數據庫的權限。

  • +0

    ,因爲在VBScript中沒有讀鎖(@Steve,-1),你必須寫打開信號燈文件或使用重命名來控制訪問。在這兩種情況下,你必須處理可能的錯誤您是否在腳本中捕獲錯誤? –

    +0

    @ Ekkehard.Horner感謝您的反饋,我已經更新了我的答案,以便更清楚。 – Steve

    +1

    做檢查然後行動(上面的步驟1和2)總是要成爲一場比賽。你應該跳過檢查,只是嘗試行爲,並適當地對錯誤做出反應。 –

    回答

    4

    而不是讓腳本創建一個文件,讓他們以獨佔模式打開一個現有的文件(也就是說,沒有人可以打開它)。如果文件打開,處理可以繼續,否則腳本必須等待。

    爲了獨佔方式打開文件時,您可以使用OpenTextFile打開它寫:

    Const ForReading = 1, ForWriting = 2, ForAppending = 8 
    Set MyFile = fso.OpenTextFile(FileName, ForWriting) 
    

    一旦處理完畢,關閉文件,以便其他腳本可以嘗試打開該文件。

    +0

    感謝您的更新。 –

    +0

    這不適合我。我想因爲我有Windows 7 64位。我相信我讀過的地方是vbscript在64位系統上的工作方式不同 – Luke101

    0

    使用您的方法,vbscript不會阻止ForWriting並等待文件關閉。啓動以下腳本兩次...首先將msgbox「文件打開...」打開...然後重新啓動。你會得到「權限被拒絕」,第二個腳本將會中斷。在錯誤恢復下一步將打敗等待文件變得可用的目標,然後再繼續。

    Const ForReading = 1, ForWriting = 2, ForAppending = 8 
    Set filesys = CreateObject("Scripting.FileSystemObject") 
    Set filetxt = filesys.OpenTextFile("c:\somefile.txt", ForWriting, True) 
    wscript.echo "File Open..." 
    filetxt.Close 
    wscript.echo "Done..." 
    

    因此,我看到有4個upvotes ...這可能是如何工作的?

    這裏有一個工作程序 - 只是坐在while循環,直到文件可用:

    lockFile 
    
    sub lockFile() 
        Dim fso, LockFile, LockFileName, done 
        Const ForWriting = 2 
    
        LockFileName = "C:\somefile.lck" 
        Set filesys = CreateObject("Scripting.FileSystemObject") 
        done = false 
        on error resume next 'need to evaluate error 
    
        while (not(done)) 
         err.clear 
         Set filetxt = filesys.OpenTextFile(LockFileName, ForWriting, True) 
         if (err.number = 0) then 
          done = true 
         else 
          done = false 
         end if 
         wscript.echo "Error [0=file open, 70=file in use] : " & err.number 
         wscript.sleep(1000) 'wait one second instead of chewing up CPU 
        wend 
    
        wscript.echo "File Open..." 
        filetxt.Close 
        wscript.echo "Done..." 
    
        on error goto 0 'reset error level 
    
    end sub