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

Windows 强制自治.bat文件按顺序运行,windows,batch-file,cmd,synchronize,Windows,Batch File,Cmd,Synchronize,我有相当多的.bat文件是由Windows任务计划程序启动的。随后,或通过过程中调用的应用程序。在后一种情况下,应用程序启动一个.bat文件以记录其已启动,另一个.bat文件以记录其已完成。它们都会触发另一个写入日志文件的logging.bat文件。有多种情况会导致它们重叠: 所有任务计划程序任务都会同时手动运行 当另一个相关任务运行时,其中一个应用程序任务仍在运行 调度程序按计划运行 因此,我们有时会看到: 进程无法访问该文件,因为另一个进程正在使用该文件 过程 这样做的结果是日志条目丢失 我

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

所有任务计划程序任务都会同时手动运行

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

因此,我们有时会看到:

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

这样做的结果是日志条目丢失

我想说清楚: 任务计划程序任务:

go1>>>启动bat_name1.bat

go2>>>启动bat_name2.bat

等等

蝙蝠名称1.bat,蝙蝠名称2.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%
@ECHO OFF
SET fileloc=C:\Users\Public\BackupLogs
echo %time% %date% %2 %3 %~1>%fileloc%\temp.txt 
type %fileloc%\temp.txt>>%fileloc%\backuplog.txt
log.bat

log.bat %nameN%
@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%的解决方案,因为仍然可能存在重叠?

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

: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操作码的值,它会改变每个处理器的时钟周期,从而使冲突变得不可能。有一些开源工具可以提供帮助,例如:。但这可能是另一个问题的主题。

您建议使用单独的tempN.txt日志文件是一个很好的建议,但正如您所说,它不能处理重叠调用。您可以编写锁定代码,使批处理文件等待运行,或在文件存在时退出。在复杂的环境中,这是一个困难且持久的维护问题。您可能需要考虑调度器工具。我在adTempus方面取得了一些成功。我只是一个用户,如果您选择adTempus,我将不会受益。