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

标签 batch-file cmd

我面临着一个非常愚蠢的问题。我有一个由 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/

相关文章:

python - 如何在不退出现有循环的情况下安排任务?

r - 运行 r 脚本后退出命令提示符

scripting - Windows 7 上的 devcon - 删除驱动程序

loops - 新行作为 FOR 循环的分隔符

powershell - 环境变量,PowerShell session 与从 CMD 启动

ruby-on-rails - 如何从一个通用脚本运行多个 watir 脚本

windows - 通过 tf.exe 确定 TFS 工作区的本地路径

java - 通过批处理文件运行 maven java 项目时忽略 log4j 属性

windows - 暂停命令在 .bat 脚本中不起作用

batch-file - 递归移动文件到根文件夹