如何找到 Windows SDK 的 SetEnv.cmd/SetEnv.cmd 无法正常工作 [英] How to find Windows SDK's SetEnv.cmd / SetEnv.cmd Does not work correctly

查看:21
本文介绍了如何找到 Windows SDK 的 SetEnv.cmd/SetEnv.cmd 无法正常工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

We have a Team City Build Server running and want to compile a Visual C++ project. So far this would be easy, since I've setup our Windows Build Agent with the Windows SDK, but we don't have a solution / project file.

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

The project files are instead created with CMake. CMake seems to be a little bit dumb (can't generate Solution when Visual Studio is not installed), but with some tricks, I could get it to do it. The solution can then be built with MSBuild.

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

And here comes the problem. For this to work automatically, I need to call the Windows SDK's SetEnv.cmd. And I can't seem to find it automatically. It's in the bin sub directory of the Windows SDK, but neither bin nor the root are in the path, and the %mssdk% environment variable is set by the SetEnv.cmd and is not available beforehand!

将 Windows SDKin 目录添加到 PATH 会导致 SetEnv.cmd 不再工作(退出并显示类似 The x86 compilers are not currently installedJump target Set_x86 not found.

Adding the Windows SDKin dir to the PATH leads to SetEnv.cmd no longer working (exits with a message like The x86 compilers are not currently installed and Jump target Set_x86 not found.

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

The start menu link is calling the SetEnv.cmd with the Windows SDK dir as working directory instead. But if I add the root directory to the PATH, BinSetEnv.cmd is not available.

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

How can I find SetEnv.cmd automatically? Even setting an environment variable to the full path of the setenv.cmd doesn't work, and when I define %mssdk% as the sdk dir, then call %mssdk%inSetEnv doesn't work as well. I also tried to define %mssdk%, then cd %mssdk%, then calling binSetEnv. Also compilers not found in all these cases. It also doesn't work if I manually cd to the root or bin dir on a command line and then call SetEnv.cmd...

开始菜单链接可以正常工作.

The start menu link works fine though.

为了记录,我现在的解决方案虽然很奇怪,但如下:

For the record, my solution for now, as strange as this is, is the following:

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

I created a MSBuild file that creates the solution file with CMake on the command line, then invokes the created solution with a MSBuild task. The MSBuild file can be easily built from TeamCity, though I needed some additional tricks to satisfy CMake's stupid looking for the compiler, though I won't invoke it thing. Not really satisfying, but it works.

推荐答案

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

My solution (sets %WindowsSdkPath%, so that SetEnv.cmd could be found under %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 "HKLMSOFTWAREMicrosoftMicrosoft SDKsWindows\%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 "%1SOFTWAREMicrosoftMicrosoft SDKsWindows" /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 SDK 的 SetEnv.cmd/SetEnv.cmd 无法正常工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆