避免在Windows批处理文件中同时调用

Mar*_*n S 1 windows semaphore batch-file

我有一个通用的Windows构建批处理(即build.bat),它与不同的参数并行运行.

start build.bat device1
start build.bat device2
start build.bat device3
Run Code Online (Sandbox Code Playgroud)

但在该批处理中,有一个可执行文件在并行调用时崩溃.

使用Windows内置函数时,是否可以在已经在另一个批处理中运行时阻止此调用,并在完成另一个批处理时继续执行此操作?

假设该批次的内容是

start delay 5
Run Code Online (Sandbox Code Playgroud)

当多次调用批处理时,当另一个延迟当前正在运行时,延迟不得运行.

这与信号量类似.

所以我的目标是拥有这样的东西

CheckAndWaitIfDelayIsRunning
start delay 5
Run Code Online (Sandbox Code Playgroud)

提前致谢.

jeb*_*jeb 6

您可以使用a批量生成信号量lock by file.

:lock
2>nul (
  > sema1.lock (
    delay 5
    REM The next line is for proper finishing the lock block
    (call )
  )
) || goto :lock
Run Code Online (Sandbox Code Playgroud)

诀窍是,只能在一次进程中写入sema1.lock.
任何其他进程都将失败并跳过内部块,|| goto :lock将重试,直到可以写入sema1.lock文件.
这种技术的一个缺点是消耗CPU,因为这个信号量不是真的等待,它更像是一个轮询信号量.

有关更多信息,请参阅SO:如何在Windows下共享日志文件?