【问题标题】:How to get an exclusive lock on a file using batch file?如何使用批处理文件获得文件的排他锁?
【发布时间】:2014-08-04 14:51:45
【问题描述】:

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

我需要做的是创建批处理文件并专门锁定一个文本文件(可以是空的,可以是满的,没关系)。这样我就可以从我的远程机器上轮询它(使用由 c# 创建的 exe)来查看文件上是否有排他锁 - 如果有,那么什么也不做。如果可以获得锁,则发出警报(因为批处理失败)。

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

【问题讨论】:

  • 普通 CMD 语句没有文件锁定功能。要获得解决方案,您需要讨论您的服务器批处理文件。
  • 同意@foxidrive - 需要服务器批处理文件的更多细节。它是否在连续循环中运行?如果有,频率如何?它是否执行长时间运行的外部命令?我认为批处理不可能保持对文件的锁定-这不是批处理的本质。它可以将频繁的消息写入日志,并且可以监控这些消息。或者(更好),使用 WMI 确认进程仍然存在。

标签: windows batch-file cmd locking


【解决方案1】:

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

@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

【讨论】:

  • 仅供参考,这不是独占而是仅在目标lockfile.txt上写入锁。
【解决方案2】:

这是一个普通的批处理文件,用于临时锁定特定文件。相应地编辑 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')"

按任意键即可解锁。

【讨论】:

  • 纯香草?我不这么认为。 :D
  • 不幸的是,我的服务器上没有 powershell,但我会记下这一点以备将来使用。谢谢指关节拖拉机!
猜你喜欢
  • 1970-01-01
  • 2014-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-25
相关资源
最近更新 更多