我面临着一个非常愚蠢的问题。我有一个由 NAnt 脚本生成的命令列表。这些都存储在一个bat文件中。在每一行中,我都调用带有多个参数的 exe。该exe 对一组文件进行操作并修改它们。文件集始终相同。我们正在谈论大约 1000 次 exe 调用,因此如果每次都会弹出一个新控制台,我就会遇到性能问题。 “没问题”我想,并将 START/B
添加到每个命令行,因此现在 exe 在后台启动,运行速度更快。
现在的问题是:正如我所提到的,exe 对同一组文件进行操作,因此有时会发生文件无法修改的情况,因为该文件已被程序的不同实例打开,从而导致崩溃。我想将 /W
参数添加到每个调用中,以确保永远不会有两个实例同时运行。但这会以某种方式禁用 /B
参数。
所以我的问题是:是否可以让我的 exe 在后台启动并强制我的批处理等待每个实例终止?
请不要告诉我这很丑。我知道,但我无法更改任何设置。我的公司多年来一直在使用这个***,我唯一可以修改的地方就是生成的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
最佳答案
您可以使用 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
编辑:直接等待的解决方案
这利用了管道将阻塞直到生产者完成的事实。
该方案在等待循环中不需要额外的CPU性能,并且可以在作业完成后立即开始下一个作业。
@echo off
call :syncExecute
call :syncExecute
call :syncExecute
exit /b
:::::::::::::
:syncExecute
( start /b c:\Windows\System32\calc.exe ) | more > nul
exit /b
关于batch-file - START/WAIT 和/B 的组合可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29142782/