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

时间:2017-06-08 18:21:48

标签: windows batch-file cmd synchronize

我有一个由Windows任务计划程序启动的相当多的.bat文件。随后,或者通过在此过程中调用的应用程序。在后一种情况下,应用程序启动.bat文件以记录它已启动,另一个.bat文件记录它已完成。它们 all 触发另一个写入日志文件的单个日志记录.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

启动STARTnameN.bat

(运行应用程序的核心)

启动ENDnameN.bat

STARTnameN.bat和ENDnameN.bat

log.bat %nameN%

log.bat

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

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

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

1 个答案:

答案 0 :(得分:0)

您可以测试附加是否失败,并通过以下内容重试:

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

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

这会改善一些事情,但是你仍然会在%fileloc%\temp.txt文件上遇到冲突问题。也许您可以使用各种.bat文件中的唯一临时名称轻松解决此问题。

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

当我想要一个真正随机的文件名时,我会涉及RDTSC操作码的值,这会改变每个处理器的时钟周期,从而无法进行冲突。有一些开源工具可以帮助解决这个问题,例如:capture RDTSC opcode。但也许这是另一个问题的主题。