强制自治.bat文件按顺序运行



我有相当多的.bat文件是由Windows任务计划程序启动的。 并且,随后,或由在此过程中调用的应用。 在后一种情况下,应用会启动一个.bat文件来记录它已启动的情况,并启动另一个.bat文件来记录它已完成的情况。 它们都会触发另一个写入日志文件的日志记录.bat文件。 有多种情况会导致它们重叠:

所有任务计划程序任务一次手动运行

当另一个相关任务时,其中一个应用任务仍在运行 调度程序按计划运行。

因此,我们有时会看到:

进程无法访问该文件,因为它正被另一个进程使用 过程。

而且,这样做的结果是错过了日志条目。

需要明确的是: 任务计划程序任务:

Go1>>>推出bat_name1.bat

Go2>>>推出bat_name2.bat

等。

bat_name1.bat, bat_name2.bat,....

CALL log.bat %bat_nameN%
app.exe %bat_nameN%
EXIT

app.exe 任务:nameN

启动开始名称N.bat

(运行应用程序的核心)

推出ENDnameN.bat

STARTnameN.bat 和 ENDnameN.bat

log.bat %nameN%

日志.bat

@ECHO OFF
SET fileloc=C:UsersPublicBackupLogs
echo %time% %date% %2 %3 %~1>%fileloc%temp.txt 
type %fileloc%temp.txt>>%fileloc%backuplog.txt

因此,目标是允许所有这些程序自主运行,但对结果进行顺序化,以便可以完全写入日志文件而不会受到干扰。

一种想法是将 temp.txt 分离到 tempN 中.txt,...并将结果附加到单个备份日志.txt作为结束过程的一部分。 这可能会让它变得更好,但似乎不是 100% 的解决方案,因为仍然存在重叠?

您可以测试追加是否失败,然后通过如下方式重试:

:try_append
copy /b %fileloc%backuplog.txt+%fileloc%temp.txt %fileloc%backuplog.txt
if errorlevel 1 goto try_append

(复制必须用作内部命令,例如 echo 和 type 不会设置错误级别。

这将改善情况,但是您仍然会遇到%fileloc%temp.txt文件冲突的问题。 也许您有办法在各种.bat文件中使用唯一的临时名称轻松解决此问题。

如果没有,可以使用 %time::=%(毫秒随机性)创建更好的随机临时文件名,但即使这样也可能发生冲突。

当我想要一个真正随机的文件名时,我涉及RDTSC操作码的值,该操作码会更改每个处理器时钟周期,从而使冲突变得不可能。 有一些开源工具可以帮助解决这个问题,例如:捕获RDTSC操作码。但也许这是另一个问题的话题。

最新更新