如何从命令行为Visual Studio创建简单生成脚本?

时间:2015-05-26 16:11:55

标签: batch-file visual-studio-2012 cmd build-script

我在多个目录中都有很多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实例)?我理解这不是一种强大的方式(并且有很多工具可以做到这一点)调用构建,但我只是希望有一个批处理脚本来自动化单独调用这些项目的手动工作。

2 个答案:

答案 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。