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

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

项目文件是用CMake创build的。 CMake似乎有点愚蠢(当Visual Studio没有安装时,不能生成解决scheme),但有一些技巧,我可以做到这一点。 该解决scheme可以使用MSBuild构build。

问题来了。 为了自动工作,我需要调用Windows SDK的SetEnv.cmd。 而我似乎无法自动find它。 它位于Windows SDK的bin子目录中,但bin和root都不在path中,并且%mssdk%环境variables由SetEnv.cmd设置,并且不可用!

将Windows SDK \ bin目录添加到PATH会导致SetEnv.cmd不再有效(退出时会显示如下消息The x86 compilers are not currently installed并且Jump target Set_x86 not found

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

我怎样才能自动findSetEnv.cmd? 即使将环境variables设置为setenv.cmd的完整path也不起作用,而当我将%mssdk%定义为sdk dir时,则调用%mssdk%\ bin \ SetEnv也不起作用。 我也尝试定义%mssdk%,然后cd%mssdk%,然后调用bin \ SetEnv。 在所有这些情况下也找不到编译器。 它也不起作用,如果我手动cd命令行上的根目录或目录,然后调用SetEnv.cmd …

开始菜单链接工作正常。

为了logging,我现在的解决scheme,就像这样奇怪,是以下几点:

我创build了一个MSBuild文件,在命令行上用CMake创build解决scheme文件,然后用MSBuild任务调用创build的解决scheme。 MSBuild文件可以很容易地从TeamCity构build,但是我需要一些额外的技巧来满足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本身的启发…

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 

现在它的工作:)