windows - 如何找到 Windows SDK 的 SetEnv.cmd/SetEnv.cmd 不能正常工作

标签 windows msbuild sdk setenv

我们有一个正在运行的 Team City Build Server,并且想要编译一个 Visual C++ 项目。到目前为止,这很容易,因为我已经使用 Windows SDK 设置了 Windows Build Agent,但我们没有解决方案/项目文件。

项目文件是使用 CMake 创建的。 CMake 似乎有点笨(未安装 Visual Studio 时无法生成解决方案),但通过一些技巧,我可以让它完成。然后可以使用 MSBuild 构建解决方案。

问题来了。为了使其自动运行,我需要调用 Windows SDK 的 SetEnv.cmd。而且我似乎无法自动找到它。它在 Windows SDK 的 bin 子目录中,但 bin 和 root 都不在路径中,%mssdk% 环境变量由 SetEnv.cmd 设置并且事先不可用!

将 Windows SDK\bin 目录添加到 PATH 会导致 SetEnv.cmd 不再工作(退出时显示一条消息,如 The x86 compilers are not currently installedJump target Set_x86 not found

开始菜单链接正在调用 SetEnv.cmd,并将 Windows SDK 目录作为工作目录。但是,如果我将根目录添加到 PATH,Bin\SetEnv.cmd 将不可用。

如何自动找到 SetEnv.cmd?即使将环境变量设置为 setenv.cmd 的完整路径也不起作用,当我将 %mssdk% 定义为 sdk 目录时,调用 %mssdk%\bin\SetEnv 也不起作用。我还尝试定义 %mssdk%,然后 cd %mssdk%,然后调用 bin\SetEnv。在所有这些情况下也找不到编译器。如果我在命令行上手动 cd 到根目录或 bin 目录,然后调用 SetEnv.cmd,它也不起作用...

虽然开始菜单链接工作正常。

郑重声明,尽管这很奇怪,但我现在的解决方案如下:

我创建了一个 MSBuild 文件,它在命令行上使用 CMake 创建解决方案文件,然后使用 MSBuild 任务调用创建的解决方案。 MSBuild 文件可以很容易地从 TeamCity 构建,尽管我需要一些额外的技巧来满足 CMake 愚蠢的寻找编译器,但我不会调用它的事情。不太令人满意,但它确实有效。

最佳答案

我的解决方案(设置%WindowsSdkPath%,以便SetEnv.cmd可以在%WindowsSdkPath%Bin\下找到):

@ECHO OFF

IF "%WindowsSdkVersion%"=="" (
  CALL :SetWindowsSdkVersionHelper HKCU > nul 2>&1
  IF ERRORLEVEL 1 CALL :SetWindowsSdkVersionHelper HKLM > nul 2>&1
  IF ERRORLEVEL 1 GOTO ERROR_NOWSDK
)

CALL :SetWindowsSdkPathHelper > nul 2>&1
IF ERRORLEVEL 1 GOTO ERROR_NOWSDK
GOTO END

:SetWindowsSdkPathHelper
SET WindowsSdkPath=
FOR /F "tokens=1,2*" %%i in ('REG QUERY "HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows\%WindowsSdkVersion%" /V InstallationFolder') DO (
    IF "%%i"=="InstallationFolder" (
        SET "WindowsSdkPath=%%k"
    )
)
IF "%WindowsSdkPath%"=="" EXIT /B 1
EXIT /B 0

:SetWindowsSdkVersion
CALL :GetWindowsSdkVersionHelper HKCU > nul 2>&1
IF ERRORLEVEL 1 CALL :GetWindowsSdkVersionHelper HKLM > nul 2>&1
IF ERRORLEVEL 1 EXIT /B 1
EXIT /B 0

:SetWindowsSdkVersionHelper
SET WindowsSdkVersion=
FOR /F "tokens=1,2*" %%i in ('REG QUERY "%1\SOFTWARE\Microsoft\Microsoft SDKs\Windows" /V "CurrentVersion"') DO (
    IF "%%i"=="CurrentVersion" (
        SET "WindowsSdkVersion=%%k"
    )
)
IF "%WindowsSdkVersion%"=="" EXIT /B 1
EXIT /B 0

:ERROR_NOWSDK
ECHO The Windows SDK %WindowsSdkVersion% could not be found.
EXIT /B 1

:END

SetEnv.cmd 本身启发了我...

关于windows - 如何找到 Windows SDK 的 SetEnv.cmd/SetEnv.cmd 不能正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/887894/

相关文章:

windows - 如何在 Windows 中保存 .env 文件?

Java JEE5 应用程序。具有 Windows 身份验证且不提示输入用户名和密码的客户端

.net - Teamcity 未满足要求 : MSBuildTools12. 0_x86_Path 存在

visual-studio - 如何在 Visual Studio 中重新定义 "Rebuild Solution"的作用?

sdk - 如何在 corona sdk 中使用 paypal?

iphone - iPhone SDK 中的透明按钮

android - Genymotion 不显示所有 API 版本

node.js - Nodejs shell 脚本在 linux 中运行良好,但在 Windows 中运行不佳。为什么它不会执行多个命令

windows - 寻找用于 Web 测试的 Windows GUI 测试工具,如 Selenium

c++ - Microsoft Build Tools 2013 缺少 v120 目录