START /WAIT 和 /B 的组合可能吗?

Mic*_*elS 2 cmd batch-file

我正面临一个非常愚蠢的问题。我有一个由 NAnt 脚本生成的命令列表。这些存储在 bat 文件中。在每一行中,我都调用了一个带有多个参数的 exe。exe 对一组文件进行操作并修改它们。文件集始终相同。我们谈论的是大约 1000 次 exe 调用,因此如果每次弹出一个新控制台,我都会遇到性能问题。“没问题”我想并添加START /B到每个命令行中,所以现在 exe 在后台启动,运行速度更快。现在问题来了:正如我所提到的,exe 对同一组文件进行操作,因此有时会发生无法修改文件的情况,因为它已被程序的不同实例打开,从而导致崩溃。我想添加/W每个调用的参数以确保永远不会有两个实例同时运行。但这以某种方式禁用了该/B参数。

所以我的问题是:是否可以让我的 exe 在后台启动并强制我的批处理等待每个实例终止?

请不要告诉我这是丑陋的。我知道,但我无法更改设置的任何内容。我的公司多年来一直在使用这个 s***,我可以进行修改的唯一点是生成的 bat 文件。

下面是生成的bat的代码:

start /B /W S:\ome\path\to\my\exe.exe --param1 --param2 "XYZ" --param3 "ZYX" --param4 "1 2 3" --param5 "321" --param6 "1337" --param7
start /B /W S:\ome\path\to\my\exe.exe --param1 --param2 "XYZ" --param3 "ZYX" --param4 "1 2 3" --param5 "321" --param6 "1337" --param7
start /B /W S:\ome\path\to\my\exe.exe --param1 --param2 "XYZ" --param3 "ZYX" --param4 "1 2 3" --param5 "321" --param6 "1337" --param7
...
start /B /W S:\ome\path\to\my\exe.exe --param1 --param2 "XYZ" --param3 "ZYX" --param4 "1 2 3" --param5 "321" --param6 "1337" --param7
start /B /W S:\ome\path\to\my\exe.exe --param1 --param2 "XYZ" --param3 "ZYX" --param4 "1 2 3" --param5 "321" --param6 "1337" --param7
start /B /W S:\ome\path\to\my\exe.exe --param1 --param2 "XYZ" --param3 "ZYX" --param4 "1 2 3" --param5 "321" --param6 "1337" --param7
Run Code Online (Sandbox Code Playgroud)

jeb*_*jeb 5

您可以start /b不使用/wait并构建自己的同步。

这会一直等到文件lock.tmp不再被start命令锁定。

本示例使用 calc.exe 进行演示。
使用 ping 命令等待一秒钟会很有用,因为如果没有 ping,cpu 使用率将上升到 100%。
但我的测试表明,等待时 CPU 仅为 5%。

@echo off

call :syncExecute
call :syncExecute
call :syncExecute
exit /b

:::::::::::::
:syncExecute
( start /b c:\Windows\System32\calc.exe ) > lock.tmp
:waitForExit
(
  REM ping -n 2 localhost > nul
  echo dummy > lock.tmp
) 2> nul || goto :waitForExit
exit /b
Run Code Online (Sandbox Code Playgroud)

编辑:直接等待的解决方案

这使用了管道将阻塞直到生产者完成的事实。
该解决方案在等待循环中不需要额外的 CPU 性能,并且可以在作业完成后立即启动下一个作业。

@echo off

call :syncExecute
call :syncExecute
call :syncExecute
exit /b

:::::::::::::
:syncExecute
( start /b c:\Windows\System32\calc.exe ) | more > nul
exit /b
Run Code Online (Sandbox Code Playgroud)