如何查找Windows SDK的SetEnv.cmd / SetEnv.cmd无法正常工作

时间:2009-05-20 13:27:40

标签: 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等消息。

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

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

,它也不起作用

开始菜单链接工作正常。

为了记录,我现在的解决方案,如同这样奇怪,如下:

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

2 个答案:

答案 0 :(得分:3)

我的解决方案(设置%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本身......的灵感启发了。

答案 1 :(得分:0)

Mac,很好的答案! 现在我想用我的项目文件运行msbuild。但在我运行SetEnv.Cmd之前 - 对吗?

所以,我们走了:

run_Macs_code.bat REM see above
call "%WindowsSdkPath%\bin\Setenv.cmd" /Release /x86 /xp
cd E:\client
msbuild client.proj

现在它正在运作:)