Visual Studio 2015生成后事件:运行两程序,待其一结束后终止另一个
解决Visual Studio 2015生成后脚本中后台启动程序并在后续步骤关闭的问题
我完全懂你的痛点——直接在生成后事件里跑@ProgramA.exe会把整个构建流程卡得死死的,毕竟Program A不会自动退出,就跟你在Linux里忘了加&直接运行程序一样,控制台被占住啥都干不了。下面给你一套适配Windows环境的解决方案,完美对应你要的“后台启动+后续关闭”需求:
1. 后台启动Program A,不阻塞构建流程
把Program A的生成后事件改成用Windows的start命令来启动,这个命令能让程序在后台独立运行,不会占用构建进程的控制台:
start "" "$(TargetDir)ProgramA.exe"
- 这里的空引号
""是必须的:start命令的第一个参数是新窗口的标题,如果省略的话,要是ProgramA的路径里有空格,命令会把路径的第一部分当成标题,直接报错。 $(TargetDir)是VS的内置宏,会自动替换成当前项目的输出目录,不用硬编码路径,适配不同的构建配置(Debug/Release)。- 如果Program A需要在特定的工作目录下运行,可以加
/D参数指定:start "" /D "$(TargetDir)" "$(TargetDir)ProgramA.exe"
2. 在Program B结束后关闭Program A
既然Program B会正常终止,那直接在Program B的生成后事件里加终止Program A进程的命令就行:
taskkill /IM ProgramA.exe /F
/IM:按进程名指定要终止的程序;/F:强制终止进程(如果Program A卡住没响应也能关掉)。
进阶:精准终止特定的Program A进程(避免误杀同名进程)
如果你的机器上可能同时运行多个ProgramA.exe,上面的命令会把它们全杀掉,这时候可以让Program A启动时把自己的PID写入一个文件,然后Program B读取这个PID来精准终止:
- 在Program A的代码里(或者启动脚本里)添加逻辑:启动时将当前进程ID写入
$(TargetDir)ProgramA.pid文件; - 然后在Program B的生成后事件里用PID杀进程:
这样就只会杀掉这次构建启动的那个Program A进程,不会影响其他实例。for /f "delims=" %%p in ("$(TargetDir)ProgramA.pid") do taskkill /PID %%p /F del "$(TargetDir)ProgramA.pid"
测试小技巧
修改生成后事件后,建议先手动在命令行里跑一遍对应的命令,确认能正常启动Program A、完成Program B的构建,并且成功关闭Program A,避免在VS里反复构建调试浪费时间。
内容的提问来源于stack exchange,提问作者Voyce
相关产品推荐
相关产品推荐

