我有一个项目,需要监控一个批处理文件的运行情况。我有一台远程机器,需要监视另一台服务器上运行的这个批处理文件。
我需要做的是让批处理文件创建并独占锁定一个文本文件(可以为空,也可以是满的,不重要)。这样,我就可以使用由C#创建的exe从远程机器轮询它,以查看文件是否被独占锁定 - 如果是,则不执行任何操作。如果可以获得锁定,则引发警报(因为批处理已失败)。
了解到这可能不是最好的方法,但不幸的是这是我必须采用的方法。那么,有没有办法使用批处理文件自动地独占锁定一个文件?
我有一个项目,需要监控一个批处理文件的运行情况。我有一台远程机器,需要监视另一台服务器上运行的这个批处理文件。
我需要做的是让批处理文件创建并独占锁定一个文本文件(可以为空,也可以是满的,不重要)。这样,我就可以使用由C#创建的exe从远程机器轮询它,以查看文件是否被独占锁定 - 如果是,则不执行任何操作。如果可以获得锁定,则引发警报(因为批处理已失败)。
了解到这可能不是最好的方法,但不幸的是这是我必须采用的方法。那么,有没有办法使用批处理文件自动地独占锁定一个文件?
一开始我对此持怀疑态度,但结果证明可以通过文件重定向来完成。考虑以下示例:
@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
参考资料:
lockfile.txt
上获取独占写锁。 - wqw这是一个简单的批处理文件,可以暂时锁定特定的文件。请根据需要编辑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')"
当您按下任意键时,它就会解锁。