【问题标题】:How to create a Simple Build Script for Visual Studio from the Command Line?如何从命令行为 Visual Studio 创建一个简单的构建脚本?
【发布时间】:2015-08-08 10:26:14
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    找到了解决方案,正如 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 告诉批处理脚本不要将命令(例如调用命令)回显到终端(但仍会显示错误和警告)

    【讨论】:

    • 我测试了脚本并注意到call "..." x86 行应该在一个新行上。我尝试编辑代码,但 SO 需要至少 6 个字符更改... :-(
    • @MaartenDocter 很好,谢谢!我已经更新了它。当我通过 vm 复制粘贴时,代码格式会被篡改。 :(
    【解决方案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 /? 则表示 Carries out the command specified by string but remains)。你不关心它的剩余,当你已经在运行你的批处理文件时,你甚至不想要一个新的 cmd.exe。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-03
      • 1970-01-01
      • 2010-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多