【问题标题】:Force autonomous .bat files to run sequentially强制自主 .bat 文件按顺序运行
【发布时间】:2017-06-08 18:21:48
【问题描述】:

我有大量由 Windows 任务计划程序启动的 .bat 文件。并且,随后,或由在此过程中调用的应用程序。在后一种情况下,应用程序会启动一个 .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 任务:名称N

启动 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% 的解决方案,因为仍然可能存在重叠?

【问题讨论】:

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

标签: windows batch-file cmd synchronize


【解决方案1】:

您可以测试附加是否失败并通过以下方式重试:

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

(copy 必须作为内部命令使用,如 echo 和 type 不会设置错误级别。)

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-25
    • 1970-01-01
    • 1970-01-01
    • 2017-07-30
    • 2017-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多