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

mat*_*aly 6 cmd batch-file build-script visual-studio-2012

我在多个目录中有很多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
Run Code Online (Sandbox Code Playgroud)

批处理脚本只执行第一行,并等到我输入exit其他之前输入.基于我对批处理文件和所有StackOverflow问题所做的研究,我对此的理解是,cmd实际上调用了自己的另一个实例,vcvarsall.bat用于设置构建环境.

这不起作用,因为键入exitdevenv设置的实例并且之后的命令无法执行,因为devenv它不是可识别的命令(因为导出的路径将不再存在)

简而言之,如何devenv在单个批处理文件中实现(将其余命令传递给定义的cmd实例)?我理解这不是一种强大的方式(并且有很多工具可以做到这一点)调用构建,但我只是希望有一个批处理脚本来自动化单独调用这些项目的手动工作.

mat*_*aly 12

如Jimmy所述,找到了解决方案,需要删除环境变量,%comspec%因为这是CMD.exe的快捷方式.

但是,只需删除"%comspec" /k就会导致CMD实例打开,然后在一秒钟后退出.我之前也尝试过call使用时创建了一个单独的CMD实例的函数%comspec%

解决方案是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
Run Code Online (Sandbox Code Playgroud)

请注意,@echo OFF告诉批处理脚本不要将命令(例如该调用命令)回显到终端(但是仍然会显示错误和警告)