3

我有几个脚本试图访问剪贴板。一次只有一个脚本可以访问剪贴板。我的解决方案不起作用。这是我实施的解决方案

  • 检查 clipboardLock.txt 是否存在。
  • - 如果它不存在则创建它
  • --do 进程
  • - 如果确实存在,则等待 3 秒到 10 秒并检查它是否存在

这没有很好地工作,因为两个脚本试图创建文件并出错。有没有一种技术可以保证只有一个脚本可以访问剪贴板?另外,我无权访问数据库。

4

2 回答 2

4

不要让脚本创建文件,而是让它们以独占模式打开现有文件(即,其他人无法打开它)。如果文件打开处理可以继续,否则脚本必须等待。

为了以独占方式打开文件,您可以使用OpenTextFile打开它进行写入:

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

处理完成后,关闭文件,以便其他脚本可以尝试打开文件。

于 2013-01-09T07:20:52.097 回答
0

使用您的方法,vbscript 不会阻止 ForWriting 并等待文件关闭。启动以下脚本两次...首先将 msgbox“文件打开...”保持打开状态...然后再次启动。您将收到“Permission Denied”,第二个脚本将中断。On Error Resume Next 将破坏等待文件可用后再继续的目标。

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 个赞成票……这可能是如何工作的?

这是一个工作例程 - 只需坐在 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
于 2016-03-18T18:37:40.623 回答