我有 .bat 将在同一时刻启动 X 次(使用不同的参数)。我希望他们修改一个特定的文件,但必须以可控的延迟顺序完成。理想情况下,我需要一种机制,只允许一个蝙蝠锁定文件并在需要时处理它,而不是释放它,允许另一个进程使用相同的东西。
问问题
2571 次
2 回答
7
对杰布的回答进行了一些改进。
不需要额外的锁定文件。queue.txt 文件可以作为自己的锁。
此外,必须保证最里面的块以 SUCCESS(错误级别 0)退出,以便仅在重定向失败时重试。(CALL )
(注意尾随空格)是一种完全不直观但非常有效的清除任何错误的方法。这里不需要,但是(CALL)
(注意空间不足)是设置错误的有效方法。
:lockedAppend
2>nul (
>>queue.txt (
REM Do any amount of processing within this block.
REM All stdout will safely be appended to the queue
REM You could even call out to a subroutine, or another batch file
echo Any text you want
REM The CALL below ensures that the block exits with ERRORLEVEL 0 - success
(call )
)
)||goto :lockedAppend
于 2013-05-18T06:42:29.967 回答
4
它可以通过文件锁来完成,由 Dostips 的dbenham 描述:具有批处理的并行进程和SO:您如何在 Windows 下共享日志文件?.
由于windows在打开一个写句柄时锁定了一个文件,相互尝试访问该文件会导致错误。
第一个进程可以访问该文件并对其进行写入,第二个进程无法打开它并将循环直到第一个进程完成。
:lockedAppend
2>nul (
>queue.lock (
>>queue.txt echo All text I want
)
)||goto :lockedAppend
于 2013-05-18T06:02:06.480 回答