并行工作的CMD实例的信号量

我有.bat这将开始X次(不同的论点)在同一时间。 我希望他们修改一个特定的文件,但必须按照可控的延迟顺序进行。 理想情况下,我需要一种机制,只允许一只蝙蝠locking文件,并在需要时进行处理,而不是释放它,以允许另一个进程执行相同的操作。

jeb的答案有一些改进。

不需要额外的锁定文件。 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 

可以用dbenham在Dostips中描述的文件锁来完成:批处理和并行处理 :你如何在Windows下共享日志文件? 。

当一个写入句柄被打开时,当Windows锁定一个文件时,彼此试图访问该文件将导致错误。

第一个进程可以访问该文件并写入,第二个进程无法打开它,并将循环直到第一个进程完成。

 :lockedAppend 2>nul ( >queue.lock ( >>queue.txt echo All text I want ) )||goto :lockedAppend