我在多个目录中都有很多Visual Studio项目解决方案(所有目录都扩展名为.sln),我想编写一个简单的批处理脚本,它将自动构建批处理文件中列出的所有解决方案。
我可以通过启动Visual Studio Command Prompt
手动构建解决方案(这只是一个执行了以下命令的命令行实例
"%comspec%" /k "C:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" x86
然后我通过调用
来构建项目 devenv "path\to\solutionFile\projectSolution1.sln" /build Debug
这将构建项目(假设项目没有错误),我会为我想要构建的每个项目进行冲洗和重复。
但当我在名为build.bat
的批处理文件中包含以下内容时:
"%comspec%" /k "C:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" x86
echo "Starting Build for all Projects with proposed changes"
echo .
devenv "path\to\solutionFile\projectSolution2.sln" /build Debug
devenv "another\path\to\solutionFile\projectSolution3.sln" /build Debug
devenv "yet\another\path\to\solutionFile\projectSolution4.sln" /build Debug
echo "All builds completed."
pause
批处理脚本只执行第一行,并等到我在执行其他行之前键入exit
。基于我对批处理文件和所有StackOverflow问题所做的研究,我对此的理解是cmd
实际上调用了自己的另一个实例来执行vcvarsall.bat
来设置构建环境。
这不起作用,因为键入exit
会使devenv
设置的实例失效,之后的命令无法执行,因为devenv
不是可识别的命令(因为导出的路径不会已经存在了)
简而言之,如何在单个批处理文件中实现(将其余命令传递给定义了devenv
的cmd实例)?我理解这不是一种强大的方式(并且有很多工具可以做到这一点)调用构建,但我只是希望有一个批处理脚本来自动化单独调用这些项目的手动工作。
答案 0 :(得分:12)
如Jimmy所述,找到解决方案,需要删除环境变量%comspec%
,因为这是CMD.exe的快捷方式。
但是,仅删除"%comspec" /k
将导致CMD实例打开,然后在一秒钟后退出。我之前也尝试了call
函数,该函数在与%comspec%
一起使用时创建了一个单独的CMD实例
解决方法是在第一行前添加call
,然后移除%comspec
这是最终批处理文件,可以按预期工作。
@echo OFF
call "C:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" x86
echo "Starting Build for all Projects with proposed changes"
echo .
devenv "path\to\solutionFile\projectSolution2.sln" /build Debug
devenv "another\path\to\solutionFile\projectSolution3.sln" /build Debug
devenv "yet\another\path\to\solutionFile\projectSolution4.sln" /build Debug
echo .
echo "All builds completed."
pause
请注意@echo OFF
告诉批处理脚本不要将命令(例如调用命令)回显到终端(但仍会显示错误和警告)
答案 1 :(得分:2)
如果这已经在批处理脚本中,那么这一行:
"%comspec%" /k "C:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" x86
可能应该是"C:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" x86
为什么呢? %comspec%
只是cmd.exe的环境变量快捷方式,如您所见,它启动了一个新的cmd实例,并指定了/ k选项(如果您运行cmd /?
,则表示{ {1}})。您不关心它剩下的,当您已经运行批处理文件时,您甚至不想要新的cmd.exe。