我有相当多的.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操作码。但也许这是另一个问题的话题。