如何使用批处理文件获取文件的独占锁定?

时间:2014-08-04 14:51:45

标签: windows batch-file cmd locking

我有一个项目,我需要监视批处理文件,该文件不断运行以查看它是否仍然有效。我有一台远程机器需要监视在另一台服务器上运行的批处理文件。

我需要做的是让批处理文件创建并专门锁定一个文本文件(可以是空的,可以是满的并不重要)。这是我可以从我的远程机器(使用由c#创建的exe)轮询它以查看文件是否有独占锁 - 如果是,则不执行任何操作。如果可以获得锁定,则发出警报(因为批处理失败)。

明白这可能不是最好的方法,但遗憾的是它是我必须要做的。那么,有没有办法使用批处理文件独立锁定文件?

2 个答案:

答案 0 :(得分:9)

我最初对此持怀疑态度,但事实证明它可以通过使用文件重定向来完成。考虑这个例子:

@echo off

if '%1' == '-lock' (
    shift
    goto :main
)
call %0 -lock > lockfile.txt
goto :eof

:main
echo %DATE% %TIME% - start
TREE C:\
echo %DATE% %TIME% - finish
goto :eof

上述批处理正在运行时,无法删除lockfile.txt。

基本上,批处理检查'-lock'参数。如果它不存在,它会使用-lock参数重新执行它并将它自己的输出重定向到lockfile.txt

也可以为批次中的“关键”部分创建锁定,例如

@echo off
echo %DATE% %TIME% - started

(
    echo Starting TREE
    tree c:\
    echo TREE finished
    ) > lock2.lock

echo %DATE% %TIME% - finished

来源:

How do you have shared log files under Windows?

http://www.dostips.com/forum/viewtopic.php?p=12454

答案 1 :(得分:1)

这是一个简单的vanilla批处理文件,用于临时锁定特定文件。相应地编辑txt路径。

@ECHO OFF
powershell.exe -command "$lock=[System.IO.File]::Open('C:\test.txt','Open','ReadWrite','None');Write-Host -NoNewLine 'Press any key to release the file...';$null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown')"

按任意键时会解锁。