如何使用批处理文件在文件上获取独占锁?

5

我有一个项目,需要监控一个批处理文件的运行情况。我有一台远程机器,需要监视另一台服务器上运行的这个批处理文件。

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

了解到这可能不是最好的方法,但不幸的是这是我必须采用的方法。那么,有没有办法使用批处理文件自动地独占锁定一个文件?


普通的CMD语句没有文件锁定功能。要得到解决方案,您需要讨论您的服务器批处理文件。 - foxidrive
同意@foxidrive的观点-需要更多有关服务器批处理文件的细节。它是否在连续循环中运行?如果是这样,频率是多少?它是否执行长时间运行的外部命令?我认为批处理无法维护文件锁定-这不是批处理处理的本质。它可以写入频繁的消息到日志中,这些消息可以被监视。或者(更好的方法)使用WMI来确认该进程仍然存在。 - andyb
2个回答

11

一开始我对此持怀疑态度,但结果证明可以通过文件重定向来完成。考虑以下示例:

@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

参考资料:

如何在Windows下共享日志文件?

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


请注意,此操作仅在目标文件lockfile.txt上获取独占写锁。 - wqw

1

这是一个简单的批处理文件,可以暂时锁定特定的文件。请根据需要编辑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')"

当您按下任意键时,它就会解锁。


3
普通的香草?我可不这么认为。 :D - foxidrive
很不幸,我的服务器上没有PowerShell,但我会记下这个以备将来使用。谢谢Knuckle dragger! - user3266154

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接