如何使用Windows SDK 7.1从命令行运行msbuild?

203

我正在为我们的CI服务器设置.NET 4.0支持。我已经安装了.NET 4.0和来自Windows 7.1 SDK的.NET工具。

在.NET 2.0和3.5上,这很简单。但是在.NET 4上,当我运行“开始菜单”中的“Windows SDK 7.1命令提示符”时,它会抱怨

The x86 compilers are not currently installed. x86-x86
Please go to Add/Remove Programs to update your installation.
.
Setting SDK environment relative to C:\Program Files\Microsoft
SDKs\Windows\v7.1
\.
Targeting Windows Server 2008 x86 Debug

然后当我尝试运行msbuild时,出现以下错误:

C:\Program Files\Microsoft SDKs\Windows\v7.1>msbuild
'msbuild' is not recognized as an internal or external command,
operable program or batch file.

C:\Program Files\Microsoft SDKs\Windows\v7.1>

我简直无法相信安装了运行时和SDK之后还无法运行msbuild...我是否错过了某些显而易见的步骤或者Windows更新,还是该放弃并开始修改系统路径了?


MS Build试图构建什么?如果是C++项目,请确保安装了x86编译器。如果您的CI服务器是Server Core,请确保安装了WOW64(尽管我在Server Core上运行CI没有成功)。 - vcsjones
不,这是在 Windows Server 2008 SP1 上使用纯 .NET 4.0 Web 应用程序。 - Dylan Beattie
那么,您无法相信您可以在不支付许可费的情况下配置构建服务器吗?VS许可证允许您在多台计算机上安装。我建议您利用这一点。 - Hans Passant
“%VCTools%”环境变量设置为什么?它应该被设置为一个路径。在该路径下是否存在“cl.exe”?另外,您的Windows系统是否是非英语版本?我听说在本地化的Windows安装中会出现一些问题。 - vcsjones
https://dev59.com/AUfRa4cB1Zd3GeqP-6rR - Kyle Alons
9个回答

400

要在命令提示符中启用msbuild,您只需将机器上msbuild.exe的安装目录添加到PATH环境变量中。

您可以通过以下方式访问环境变量:

  1. 右键单击计算机
  2. 点击属性
  3. 然后在左侧导航栏上点击高级系统设置
  4. 在下一个对话框中点击环境变量
  5. 向下滚动到PATH
  6. 编辑它以包含您的框架路径(不要忘记在此处的最后一个条目之后添加";")。

供参考,我的路径是C:\Windows\Microsoft.NET\Framework\v4.0.30319

路径更新:

从MSBuild 12(2013)/VS 2013/.NET 4.5.1+以及之后的版本开始,MSBuild现在作为Visual Studio的一部分安装
对于VS2015,路径是%ProgramFiles(x86)%\MSBuild\14.0\Bin 对于VS2017,路径是%ProgramFiles(x86)%\Microsoft Visual Studio\2017\<YOUR_VS_EDITION>\MSBuild\15.0\Bin 对于VS2019,路径是%ProgramFiles(x86)%\Microsoft Visual Studio\2019\<YOUR_VS_EDITION>\MSBuild\Current\Bin 对于VS2022,路径是%ProgramFiles%\Microsoft Visual Studio\2022\<YOUR_VS_EDITION>\MSBuild\Current\Bin 请确保 <YOUR_VS_EDITION> 与您已安装的 Visual Studio 版本相匹配,例如 PreviewCommunityProfessionalEnterprise

2
我也这样做,以便在PowerShell中始终可以使用msbuild。 - Wiebe Tijsma
57
添加新路径后,请记得重新启动命令提示符。 - Campinho
4
同时,分号后面不能有任何空格。 - Michael Fry
4
那是旧目录,MSBuild不随.NET Framework一起安装,实际上,即使在提出问题的时候,它也已经被弃用了。https://msdn.microsoft.com/en-us/library/hh162058.aspx - J. M. Becker
9
MSBuild 15.0 的路径已更改。现在它位于 VisualStudio 2017 安装目录下。例如:C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin。 请参见https://learn.microsoft.com/en-us/visualstudio/msbuild/what-s-new-in-msbuild-15-0。 - Assaf Israel
显示剩余7条评论

75
自从 Visual Studio 2013MSBuild 已成为 Visual Studio 的一部分。早期,MSBuild 是作为 .NET Framework 的一部分安装的。 MSBuild 直接安装在 %ProgramFiles% 下。因此,根据 Visual Studio 的版本,MSBuild 的路径可能不同。
对于 Visual Studio 2015MSBuild 的路径是 "%ProgramFiles(x86)%\MSBuild\14.0\Bin\MSBuild.exe" 对于 Visual Studio 15 PreviewMSBuild 的路径是 "%ProgramFiles(x86)%\MSBuild\15.0\Bin\MSBuild.exe" 此外,添加了一些新的 MSBuild 属性,一些属性也已被修改。 有关更多信息,请访问 这里更新 1:VS 2017 MSBuild的位置在发布Visual Studio 2017后再次更改。现在安装目录在%ProgramFiles(x86)%\Microsoft Visual Studio\2017\[VS Edition]\MSBuild\15.0\Bin\下。由于我使用的是企业版,我的机器上MSBuild的位置是"%ProgramFiles(x86)%\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\MSbuild.exe"
更新2: VS 2019
路径为C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\MsBuild.exe

15
使用“Visual Studio 20XX的开发人员命令提示符”快捷方式,而不是“cmd”,将自动设置msbuild的路径,无需将其添加到环境变量中。

1
不,它不支持(至少在仅安装了msbuild而没有安装Visual Studio的环境中不支持)。 - Ezh
如果未安装Visual Studio 20XX,就不会有“Visual Studio 20XX开发人员命令提示符”的快捷方式。 - ivan_pozdeev
如果没有安装Visual Studio 20XX,就不会有“Visual Studio 20XX开发人员命令提示符”的快捷方式。 - undefined

6
您的批处理文件可以像这样:

您的批处理文件可以是这个样子:

CD C:\Windows\Microsoft.NET\Framework64\v4.0.30319

msbuild C:\Users\mmaratt\Desktop\BladeTortoise\build\ALL_BUILD.vcxproj

PAUSE

EXIT

1
提供完整的msbuild路径意味着您可以在当前目录中查找项目文件,而不是硬编码它。类似于C:\Windows\Microsoft.NET\Framework64\v4.0.30319\msbuild *.*proj这样的东西可能会做到,尽管请注意较新版本的MSBuild(大约2013年)的路径不同。 - jpaugh
虽然路径在2022年仍然存在且始终不变,但它无法构建 .net core 项目。很遗憾。 - ADM-IT

6

对于 Visual Studio 2019(预览版至少),现在将其放置在以下位置:

C:\Program Files (x86)\Microsoft Visual Studio\2019\Preview\MSBuild\Current\Bin\MSBuild.exe

我想正式版的 2019 版本过程也会类似。


在Visual Studio 2019中,路径为C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\MSBuild\Current\Bin\MsBuild.exe - eddex

2

对于 Visual Studio 2022(至少是预览版),现在路径为:

C:\Program Files\Microsoft Visual Studio\2022\Preview\MSBuild\Current

我想正式发布的 2022 版本过程应该也类似。


是的,现在就是这条路径。 - Florian

2
要使用C# 6语法进行构建,请在以下路径中使用此内容:

C:\Program Files (x86)\MSBuild\14.0\Bin


请注意保留html标签。

1

对于 Visual Studio 2022,您需要将以下内容添加到“环境变量”中:

%ProgramFiles%\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin

如果您的 Windows 中没有此路径,请通过搜索 %ProgramFiles% 目录找到类似的路径。


-4

"SDK命令提示符"快捷方式随Windows SDK 7.1安装的SetEnv.cmd脚本错误地在添加任何条目到PATH之前在不同位置运行检查cl.exe。因此,如果未安装本机C编译器,即使.NET工具已安装,它也无法添加任何内容。

解决方法是运行Windows SDK 7.1安装程序并同时安装SDK的本机C++工具链。

真正的修复方法是应用以下补丁到SetEnv.cmd

它位于<SDK安装目录>\Bin\SetEnv.cmd下。这也将修复位于<SDK安装目录>\Bin和子文件夹中的其他工具的缺失路径问题。

--- SetEnv.Cmd_ 2010-04-27 19:52:00.000000000 +0400
+++ SetEnv.Cmd  2013-12-02 15:05:30.834400000 +0400
@@ -228,10 +228,10 @@
 
 IF "%CURRENT_CPU%" =="x64" (
   IF "%TARGET_CPU%" == "x64" (
+    SET "FxTools=%FrameworkDir64%\%FrameworkVersion%;%FrameworkDir32%%FrameworkVersion%;%windir%\Microsoft.NET\Framework64\v3.5;%windir%\Microsoft.NET\Framework\v3.5;"
+    SET "SdkTools=%WindowsSdkDir%Bin\NETFX 4.0 Tools\x64;%WindowsSdkDir%Bin\x64;%WindowsSdkDir%Bin;"
     IF EXIST "%VCTools%\amd64\cl.exe" (
       SET "VCTools=%VCTools%\amd64;%VCTools%\VCPackages;"
-      SET "SdkTools=%WindowsSdkDir%Bin\NETFX 4.0 Tools\x64;%WindowsSdkDir%Bin\x64;%WindowsSdkDir%Bin;"
-      SET "FxTools=%FrameworkDir64%\%FrameworkVersion%;%FrameworkDir32%%FrameworkVersion%;%windir%\Microsoft.NET\Framework64\v3.5;%windir%\Microsoft.NET\Framework\v3.5;"
     ) ELSE (
       SET VCTools=
       ECHO The x64 compilers are not currently installed.
@@ -239,10 +239,10 @@
       ECHO .
     )
   ) ELSE IF "%TARGET_CPU%" == "IA64" (
+    SET "FxTools=%FrameworkDir64%\%FrameworkVersion%;%FrameworkDir32%%FrameworkVersion%;%windir%\Microsoft.NET\Framework64\v3.5;%windir%\Microsoft.NET\Framework\v3.5;"
+    SET "SdkTools=%WindowsSdkDir%Bin\NETFX 4.0 Tools\x64;%WindowsSdkDir%Bin\x64;%WindowsSdkDir%Bin;"
     IF EXIST "%VCTools%\x86_ia64\cl.exe" (
       SET "VCTools=%VCTools%\x86_ia64;%VCTools%\VCPackages;"
-      SET "SdkTools=%WindowsSdkDir%Bin\NETFX 4.0 Tools\x64;%WindowsSdkDir%Bin\x64;%WindowsSdkDir%Bin;"
-      SET "FxTools=%FrameworkDir64%\%FrameworkVersion%;%FrameworkDir32%%FrameworkVersion%;%windir%\Microsoft.NET\Framework64\v3.5;%windir%\Microsoft.NET\Framework\v3.5;"
     ) ELSE (
       SET VCTools=
       ECHO The IA64 compilers are not currently installed.
@@ -250,10 +250,10 @@
       ECHO .
     )
   ) ELSE IF "%TARGET_CPU%" == "x86" (
+    SET "FxTools=%FrameworkDir32%%FrameworkVersion%;%windir%\Microsoft.NET\Framework\v3.5;"
+    SET "SdkTools=%WindowsSdkDir%Bin\NETFX 4.0 Tools;%WindowsSdkDir%Bin;"
     IF EXIST "%VCTools%\cl.exe" (
       SET "VCTools=%VCTools%;%VCTools%\VCPackages;"
-      SET "SdkTools=%WindowsSdkDir%Bin\NETFX 4.0 Tools;%WindowsSdkDir%Bin;"
-      SET "FxTools=%FrameworkDir32%%FrameworkVersion%;%windir%\Microsoft.NET\Framework\v3.5;"
     ) ELSE (
       SET VCTools=
       ECHO The x86 compilers are not currently installed.
@@ -263,10 +263,10 @@
   )
 ) ELSE IF "%CURRENT_CPU%" =="IA64" (
   IF "%TARGET_CPU%" == "IA64" (
+    SET "FxTools=%FrameworkDir64%\%FrameworkVersion%;%FrameworkDir32%%FrameworkVersion%;%windir%\Microsoft.NET\Framework64\v3.5;%windir%\Microsoft.NET\Framework\v3.5;"
+    SET "SdkTools=%WindowsSdkDir%Bin\NETFX 4.0 Tools\IA64;%WindowsSdkDir%Bin\IA64;%WindowsSdkDir%Bin;"
     IF EXIST "%VCTools%\IA64\cl.exe" (
       SET "VCTools=%VCTools%\IA64;%VCTools%;%VCTools%\VCPackages;"
-      SET "SdkTools=%WindowsSdkDir%Bin\NETFX 4.0 Tools\IA64;%WindowsSdkDir%Bin\IA64;%WindowsSdkDir%Bin;"
-      SET "FxTools=%FrameworkDir64%\%FrameworkVersion%;%FrameworkDir32%%FrameworkVersion%;%windir%\Microsoft.NET\Framework64\v3.5;%windir%\Microsoft.NET\Framework\v3.5;"
     ) ELSE (
       SET VCTools=
       ECHO The IA64 compilers are not currently installed.
@@ -274,10 +274,10 @@
       ECHO .
     )
   ) ELSE IF "%TARGET_CPU%" == "x64" (
+    SET "FxTools=%FrameworkDir64%\%FrameworkVersion%;%FrameworkDir32%%FrameworkVersion%;%windir%\Microsoft.NET\Framework64\v3.5;%windir%\Microsoft.NET\Framework\v3.5;"
+    SET "SdkTools=%WindowsSdkDir%Bin\NETFX 4.0 Tools\IA64;%WindowsSdkDir%Bin\IA64;%WindowsSdkDir%Bin;"
     IF EXIST "%VCTools%\x86_amd64\cl.exe" (
       SET "VCTools=%VCTools%\x86_amd64;%VCTools%\VCPackages;"
-      SET "SdkTools=%WindowsSdkDir%Bin\NETFX 4.0 Tools\IA64;%WindowsSdkDir%Bin\IA64;%WindowsSdkDir%Bin;"
-      SET "FxTools=%FrameworkDir64%\%FrameworkVersion%;%FrameworkDir32%%FrameworkVersion%;%windir%\Microsoft.NET\Framework64\v3.5;%windir%\Microsoft.NET\Framework\v3.5;"
     ) ELSE (
       SET VCTools=
       ECHO The VC compilers are not currently installed.
@@ -285,10 +285,10 @@
       ECHO .
     )
   ) ELSE IF "%TARGET_CPU%" == "x86" (
+    SET "FxTools=%FrameworkDir32%%FrameworkVersion%;%windir%\Microsoft.NET\Framework\v3.5;"
+    SET "SdkTools=%WindowsSdkDir%Bin\NETFX 4.0 Tools;%WindowsSdkDir%Bin;"
     IF EXIST "%VCTools%\cl.exe" (
       SET "VCTools=%VCTools%;%VCTools%\VCPackages;"
-      SET "SdkTools=%WindowsSdkDir%Bin\NETFX 4.0 Tools;%WindowsSdkDir%Bin;"
-      SET "FxTools=%FrameworkDir32%%FrameworkVersion%;%windir%\Microsoft.NET\Framework\v3.5;"
     ) ELSE (
       SET VCTools=
       ECHO The x86 compilers are not currently installed.
@@ -298,10 +298,10 @@
   )
 ) ELSE IF "%CURRENT_CPU%"=="x86" (
   IF "%TARGET_CPU%" == "x64" (
+    SET "FxTools=%FrameworkDir32%%FrameworkVersion%;%windir%\Microsoft.NET\Framework\v3.5;"
+    SET "SdkTools=%WindowsSdkDir%Bin\NETFX 4.0 Tools;%WindowsSdkDir%Bin;"
     IF EXIST "%VCTools%\x86_amd64\cl.exe" (
       SET "VCTools=%VCTools%\x86_amd64;%VCTools%\VCPackages;"
-      SET "SdkTools=%WindowsSdkDir%Bin\NETFX 4.0 Tools;%WindowsSdkDir%Bin;"
-      SET "FxTools=%FrameworkDir32%%FrameworkVersion%;%windir%\Microsoft.NET\Framework\v3.5;"
     ) ELSE (
       SET VCTools=
       ECHO The x64 cross compilers are not currently installed.
@@ -309,10 +309,10 @@
       ECHO .
     )
   ) ELSE IF "%TARGET_CPU%" == "IA64" (
+    SET "FxTools=%FrameworkDir32%%FrameworkVersion%;%windir%\Microsoft.NET\Framework\v3.5;"
+    SET "SdkTools=%WindowsSdkDir%Bin\NETFX 4.0 Tools;%WindowsSdkDir%Bin;"
     IF EXIST "%VCTools%\x86_IA64\cl.exe" (
       SET "VCTools=%VCTools%\x86_IA64;%VCTools%;%VCTools%\VCPackages;"
-      SET "SdkTools=%WindowsSdkDir%Bin\NETFX 4.0 Tools;%WindowsSdkDir%Bin;"
-      SET "FxTools=%FrameworkDir32%%FrameworkVersion%;%windir%\Microsoft.NET\Framework\v3.5;"
     ) ELSE (
       SET VCTools=
       ECHO The IA64 compilers are not currently installed.
@@ -320,10 +320,10 @@
       ECHO .
     )
   ) ELSE IF "%TARGET_CPU%" == "x86" (
+    SET "FxTools=%FrameworkDir32%%FrameworkVersion%;%windir%\Microsoft.NET\Framework\v3.5;"
+    SET "SdkTools=%WindowsSdkDir%Bin\NETFX 4.0 Tools;%WindowsSdkDir%Bin;"
     IF EXIST "%VCTools%\cl.exe" (
       SET "VCTools=%VCTools%;%VCTools%\VCPackages;"
-      SET "SdkTools=%WindowsSdkDir%Bin\NETFX 4.0 Tools;%WindowsSdkDir%Bin;"
-      SET "FxTools=%FrameworkDir32%%FrameworkVersion%;%windir%\Microsoft.NET\Framework\v3.5;"
     ) ELSE (
       SET VCTools=
       ECHO The x86 compilers are not currently installed. x86-x86
@@ -331,15 +331,17 @@
       ECHO .
     )
   )
-) ELSE IF EXIST "%VCTools%\cl.exe" (
-  SET "VCTools=%VCTools%;%VCTools%\VCPackages;"
-  SET "SdkTools=%WindowsSdkDir%Bin\NETFX 4.0 Tools;%WindowsSdkDir%Bin;"
-  SET "FxTools=%FrameworkDir32%%FrameworkVersion%;%windir%\Microsoft.NET\Framework\v3.5;"
 ) ELSE (
-  SET VCTools=
-  ECHO The x86 compilers are not currently installed. default
-  ECHO Please go to Add/Remove Programs to update your installation.
-  ECHO .
+  SET "FxTools=%FrameworkDir32%%FrameworkVersion%;%windir%\Microsoft.NET\Framework\v3.5;"
+  SET "SdkTools=%WindowsSdkDir%Bin\NETFX 4.0 Tools;%WindowsSdkDir%Bin;"
+  IF EXIST "%VCTools%\cl.exe" (
+    SET "VCTools=%VCTools%;%VCTools%\VCPackages;"
+  ) ELSE (
+    SET VCTools=
+    ECHO The x86 compilers are not currently installed. default
+    ECHO Please go to Add/Remove Programs to update your installation.
+    ECHO .
+  )
 )
 
 :: --------------------------------------------------------------------------------------------

1
这是我见过的最疯狂和复杂的解决方案 :-))) - ADM-IT
@ADM-IT 欢迎来到精彩的下游修补世界。 - ivan_pozdeev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接