VS2010命令提示符出错:无法确定VS Common Tools文件夹的位置

时间:2010-08-11 17:46:23

标签: visual-studio-2010

我已经安装了VS2010。安装会为VS2010命令提示符创建快捷方式,但是当我打开命令提示符时出现错误:

  

无法确定VS Common Tools文件夹的位置。

我检查了环境变量VS100COMNTOOLS,它的值为C:\Program Files\Microsoft Visual Studio 10.0\Common7\Tools\HKEY_local_Machine\Software\Microsoft\Visual Studio\SxS\VS7的注册表设置为:C:\Program Files\Microsoft Visual Studio 10.0\

我检查了VSvars32.bat并尝试添加echo以查找它到达的位置。它在此命令失败:

@call :GetVSCommonToolsDirHelper32 HKLM > nul 2>&1

24 个答案:

答案 0 :(得分:55)

我遇到了同样的问题并找到了答案here

问题是,bat使用de reg 命令,并在PATH系统变量中搜索。不知何故,你设法从PATH变量中获取“C:\ Windows \ System32”,所以只需转到系统变量(右击“我的电脑”>“属性”>高级配置>“环境变量”,搜索PATH变量并在末尾添加“; ”分隔: C:\ Windows \ System32

答案 1 :(得分:40)

我在两台机器上遇到了同样的问题:Win8.1x64与Visual Studio Ultimate 2013(VS2013)和Win8x64与VS2013终极

问题:指向文件的快捷方式“ VS2012 x86 Native Tools命令提示符”: C:\ Program Files(x86)\ Microsoft Visual Studio 11.0 \ VC \ vcvarsall.bat 调用 C:\ Program Files(x86)\ Microsoft Visual Studio 11.0 \ VC \ bin \ vcvars32.bat 尝试在注册表中搜索值名称“11.0”:

reg query "%1\SOFTWARE\Microsoft\VisualStudio\SxS\VS7" /v "11.0"

但是我的机器没有此值“11.0”,而是“12.0”

我的解决方案是运行 C:\ Program Files(x86)\ Microsoft Visual Studio 12.0 \ VC \ vcvarsall.bat ,调用 C:\ Program文件(x86)\ Microsoft Visual Studio 12.0 \ VC \ bin \ vcvars32.bat ,它正确地查询注册表如下:

reg query "%1\SOFTWARE\Microsoft\VisualStudio\SxS\VS7" /v "12.0"

C:\ Program Files(x86)\ Microsoft Visual Studio 11.0 \ VC \ vcvarsall.bat 更改/运行到 C:\ Program Files(x86)\ Microsoft Visual Studio 12.0 \ VC \ vcvarsall.bat 在我的案例中解决了它

答案 2 :(得分:29)

这个问题刚刚开始发生,我可以通过更新位于C:\ Program Files(x86)\ Microsoft Visual Studio 10.0 \ VC \ bin \文件夹中的vcvars32.bat文件来“修复”它(默认情况下)。在第一行之后添加以下内容:

@SET VSINSTALLDIR=c:\Program Files\Microsoft Visual Studio 10.0\
@SET VCINSTALLDIR=c:\Program Files\Microsoft Visual Studio 10.0\VC\
@SET FrameworkDir32=c:\Windows\Microsoft.NET\Framework\
@SET FrameworkVersion32=v4.0.30319
@SET Framework35Version=v3.5

然后注释掉以下几行:

:: @call :GetVSCommonToolsDir
:: @if "%VS100COMNTOOLS%"=="" goto error_no_VS100COMNTOOLSDIR
:: @call "%VS100COMNTOOLS%VCVarsQueryRegistry.bat" 32bit No64bit

找到此here。请注意,我说修复引号,因为我没有检查以确保所有适当的变量都设置正确;那说,粗略地看一看它似乎是有效的。

请注意,您必须在提升的文本编辑器(即,以管理员身份运行)中编辑vcvars32.bat文件,才能将文件保存在Vista和Windows 7中。

答案 3 :(得分:10)

我的案例中的问题是PATH变量中的拼写错误。由于vsvars32.bat使用“reg”工具查询注册表,因此找不到该工具,因为找不到该工具(只是在命令提示符下键入reg对我来说失败了。)

答案 4 :(得分:6)

这是一篇很棒的文章。在对vcvarsall.bat文件进行所有更改之前,请尝试以管理员身份运行vs2010命令提示符。如果仍然无法解决问题,请尝试将C:\ Windows \ System32添加到PATH环境变量。如果所有其他方法都失败,请按上述方法编辑批处理文件。

答案 5 :(得分:2)

由于注册表编辑被组策略阻止,我不久前就有了这个。

具体问题是reg被拒绝访问注册表。我通过复制' reg.exe来解决这个问题。在C#程序中使用Microsoft.Win32.Registry,然后用我的替代程序替换所有对reg的调用。您需要更新:

  • VCVarsQuery.bat
  • VsDevCmd.bat
  • VsVars32.bat

%VSxxxCOMNTOOLS%文件夹中(通常解析为类似C:\ Program Files(x86)\ Microsoft Visual Studio XX.X \ Common7 \ Tools)

    static int Main(string[] args)
    {
        try
        {
            var targetRegistry = args[1].Substring(0, 4);
            var targetKey = args[1].Substring(5);

            string targetValue = null;
            if (args[2].ToLower() == "/v")
            {
                targetValue = args[3];
            }
            else
            {
                return 1;
            }

            var hkey = targetRegistry == "HKLM" ? Registry.LocalMachine : Registry.CurrentUser;
            var key = hkey.OpenSubKey(targetKey);



            var result = key.GetValue(targetValue);
            Console.WriteLine();
            Console.WriteLine(key.Name);
            Console.WriteLine("    {0}    REG_SZ    {2}", targetValue, key.GetValueKind(targetValue), result);
            Console.WriteLine();
            Console.WriteLine();

            return 0;
        }
        catch
        {
            return 1;
        }
    }

在这种情况下,您还可以使用我的替代reg实施here

答案 6 :(得分:1)

当iI安装python库时,我发生了同样的问题,并且说无法找到Visual Studio 2008/10的路径。我已经从环境变量中更改了PATH。因此,要更改它,您可以采用以下过程: 开始=> Computer => Properties => Advance System Settings => Environment Variables => System Variables。在这里你会找到路径变量。如果已经设置了某些路径,则可以使用分号(;)添加给定路径" C:\ Windows \ System32 "否则直接添加相同的内容。

答案 7 :(得分:1)

我遇到了同样的问题。我查看了'PATH'变量的环境变量我找不到这个。然后我添加了一个带有“C:\ Windows \ System32”值的变量“Path”。现在一切都解决了。

答案 8 :(得分:1)

将路径指向计算机上的正确位置。此设置假定您将大多数程序安装在中央位置(C:\ Development)。对于我的使用,我没有因此消除对DEV的需要。

@ECHO OFF

set DEV=C:\Development
set QTDIR=%DEV%\Qt
set PATH=%SystemRoot%;%SystemRoot%\system32;%QTDIR%\bin

echo Setting OpenSSL Env.
set OPENSSL=%DEV%\OpenSSL
set PATH=%OPENSSL%\bin;%PATH%
set LIB=%OPENSSL%\lib
set INCLUDE=%OPENSSL%\include

echo Setting NASM Env.
set PATH=%DEV%\NASM;%PATH%

echo Setting DirectX Env.
set LIB=%DEV%\DirectX SDK\Lib\x86;%LIB%
set INCLUDE=%DEV%\DirectX SDK\Include;%INCLUDE%

echo Setting Windows SDK Env.
set WindowsSdkDir=%DEV%\Windows 7.1 SDK
set PATH=%WindowsSdkDir%\Bin;%PATH%
set LIB=%WindowsSdkDir%\Lib;%LIB%
set INCLUDE=%WindowsSdkDir%\Include;%INCLUDE%
set TARGET_CPU=x86

echo Setting MSVC2010 Env.
set VSINSTALLDIR=%DEV%\MSVC
set VCINSTALLDIR=%DEV%\MSVC\VC
set DevEnvDir=%VSINSTALLDIR%\Common7\IDE
set PATH=%VCINSTALLDIR%\bin;%VSINSTALLDIR%\Common7\Tools;%VSINSTALLDIR%\Common7\IDE;%VCINSTALLDIR%\VCPackages;%PATH%
set INCLUDE=%VCINSTALLDIR%\include;%INCLUDE%
set LIB=%VCINSTALLDIR%\lib;%LIB%
set LIBPATH=%VCINSTALLDIR%\lib

echo Setting Framework Env.
set FrameworkVersion=v4.0.30319
set Framework35Version=v3.5
set FrameworkDir=%SystemRoot%\Microsoft.NET\Framework
set LIBPATH=%FrameworkDir%\%FrameworkVersion%;%FrameworkDir%\%Framework35Version%;%LIBPATH%
set PATH=%LIBPATH%;%PATH%

echo Setting Perl Env.
set PATH = C:\Perl\bin;%PATH%

echo Env. ready.

title Qt Framework 4.8.0 Development Kit.

cd %DEV%

将文件另存为* .bat

运行Visual Studio命令提示符,然后执行* .bat。

这应解决所有环境问题,因此请运行configure

修改的 几乎忘了信用到期的信用: http://developer.qt.nokia.com/wiki/Building_Qt_Desktop_for_Windows_with_MSVC

答案 9 :(得分:1)

我有同样的问题,但原因不同。我在当前目录中有“reg.bat”。将其重命名为其他任何问题都可以解决问题。

答案 10 :(得分:1)

所以,我找出了这个线程中所有问题的根本原因。我原本以为它特定于2010年,但2013年的批处理文件具有相同的令牌解析语法错误。基本上,MS从2010年到2013年与其编译器一起分发的所有批处理文件都有同样的错误。如果您搜索所有.bat文件以查找此字符串

"%%i"

并将其替换为

"%%j"

一切都会正常运作。基本上,他们试图在注册表中查询不同的版本条目,以获得正确的使用路径。它们创建一个for循环,它将遍历查询所引入的每一行的标记。有三个令牌应该回来。他们使用%% i作为REG_SZ的第一个,看看是否找到了什么。然后他们使用相同的版本来比较版本字符串。他们应该使用%% j来获得第二个令牌,它将是8.0或10.0或12.0并且实际上会产生良好的比较。然后他们正确使用%% k来获取与版本相关的路径。

再次,在所有具有如下模式的文件中进行简单搜索和替换:

@for /F "tokens=1,2*" %%i in ('reg query "%1\SOFTWARE\Microsoft\VisualStudio\SxS\VS7" /v "12.0"') DO (
    @if "%%i"=="12.0" (
        @SET "VS120COMNTOOLS=%%k"
    )
)

并使它看起来像这样:

@for /F "tokens=1,2*" %%i in ('reg query "%1\SOFTWARE\Microsoft\VisualStudio\SxS\VS7" /v "12.0"') DO (
    @if "%%j"=="12.0" (
        @SET "VS120COMNTOOLS=%%k"
    )
)

通过将引号中的第二次出现的%% i更改为%% j。

希望这有帮助!

答案 11 :(得分:0)

我在Windows XP上遇到与Visual Studio 2010相同的问题。 只需删除所有结构:

\Microsoft Visual Studio 10.0\VC\bin\vcvars32.bat
\Microsoft Visual Studio 10.0\Common7\Tools\VCVarsQueryRegistry.bat

来自档案:

initialValues

答案 12 :(得分:0)

在我的情况下,我将安装VS.Net 2015更新2并离开Windows 8.1 SDK框UNchecked(因为我现在使用的是Windows 10并且认为没有必要)。但是,这似乎导致了一些必需的注册表设置被忽略。

从控制面板修改VS.Net 2015并检查8.1 SDK框解决了问题。

答案 13 :(得分:0)

另一个原因可能是VS 2013社区更新5安装了错误的快捷方式;它为VS 2013安装了VS 2012快捷方式。

要修复它,请编辑快捷方式。将它们从2012年重命名为2013年,并在vcvarsall的路径中将“11”更改为“12”。

请参阅this microsoft social post

答案 14 :(得分:0)

我在Windows 7构建系统上进行构建时遇到了同样的问题。我正在填补我们的构建工程师的缺席,这是我自从Windows XP迁移到Windows 7 32位以来我第一次完成它。我们的构建系统的IT需求已将权限锁定到很难执行大多数例行操作的位置。事实证明,问题是由于缺乏提升的特权。通过关闭Visual Studio 2010并使用管理员权限(以管理员身份运行)重新打开它,问题得以解决。

答案 15 :(得分:0)

vs开发人员命令提示符和cmd中解决此问题的简单方法是添加以下行

  

C:\ Windows \ System32

进入系统路径,如下所示:

  

我的PC->属性->高级->环境变量->系统变量    希望它能解决问题。

答案 16 :(得分:0)

我的问题有点不同。 如@kzfabi所提到的-进行注册以获取已安装VS版本的详细信息。 因此,执行开发人员命令行工具exe的用户需要管理员访问权限以及注册表编辑权限。 在公司设置的受控环境中,您可能没有这些权利并导致此错误。

答案 17 :(得分:0)

以上都没有解决我的问题。

我在“Path”或“PATH”环境变量中添加了“C:/ Windows / System32”。我可以使用reg /?命令。我还运行了'vcvarsall.bat'文件,没有错误消息。

我的错误是我正在运行 VS2012 Cross Tools命令提示符而不是 VS2013 Cross Tools命令提示符

原因是开始菜单中的文件结构。 2010年和2012年属于“Microsoft Visual Studio 年度”,2013年属于“Visual Studio 年度”。我只是没有意识到这一点。 :/

我希望这有助于某人。

答案 18 :(得分:0)

所以这可能是晚会的时间,但实际问题是错误,或者更确切地说是在三个批处理文件中重复相同的错误。

C:\ Program Files(x86)\ Microsoft Visual Studio 10.0 \ Common7 \ Tools \ VCVarsQueryRegistry.bat

C:\ Program Files(x86)\ Microsoft Visual Studio 10.0 \ Common7 \ Tools \ vsvars32.bat

C:\ Program Files(x86)\ Microsoft Visual Studio 10.0 \ VC \ bin \ vcvars32.bat

错误的模式无处不在,for循环用于遍历注册表值。它看起来像这样:

@for /F "tokens=1,2*" %%i in ('reg query "%1\SOFTWARE\Microsoft\VisualStudio\SxS\VS7" /v "10.0"') DO (
    @if "%%i"=="10.0" (
        @SET "VS100COMNTOOLS=%%k"
    )
)

问题是%% i的第二次出现。循环结构的工作方式是第一个%%变量是第一个标记,下一个是第二个标记,依此类推。所以第二个%%我应该是%% j(或任何你想要的),以便它指向可能是“10.0”的值。您可以告诉开发人员想要使用i,j,k作为值,因为在if中的@SET中,它们使用%% k。这将是道路。

因此,简而言之,在上面的三个文件中浏览所有这些类型的循环,并将第二次出现的%% i更改为%% k,一切都会像预期的那样工作。所以看起来应该是这样的:

@for /F "tokens=1,2*" %%i in ('reg query "%1\SOFTWARE\Microsoft\VisualStudio\SxS\VS7" /v "10.0"') DO (
    @if "%%j"=="10.0" (
        @SET "VS100COMNTOOLS=%%k"
    )
)

希望这会有所帮助。不确定这是否适用于所有版本。我只知道它确实适用于VS 2010(SP1)。

答案 19 :(得分:0)

我也面临同样的问题。最初尝试修改没有解决的系统路径。后来通过安装Micro Visual Studio express来解决。

答案 20 :(得分:0)

我有一只粗糙的野兽只使用Microsoft Windows SDK v7.1批处理文件 SetEnv.Cmd - 即:我没有安装Visual Studio vAny,也没有使用任何特别准备的cmd提示( vsvars32.bat 等等他们丑陋的头部)。我只是在他们的C / C ++编译器中安装了 Microsoft Windows SDK for Windows 7(7.1)。在我的Xp64盒子上,这是我以前能够编译2010年6月DirectX SDK音频样本之一的序列:

REM open a regular old cmd.exe and run these 3
REM this builds the Win32 (ie: x86) version of the exe

cd "C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Samples\C++\XACT\Tutorials\Tut02_Stream"

"C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.Cmd" /debug /x86 /xp

"C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe" Tut02_Stream_2010.sln /p:Configuration=Debug /p:Platform=Win32

请注意,使用Framework64版本的MSBuild.exe阻止我构建X64版本(由于目标?),但是X86版本的MSBuild成功构建了同一教程exe的X64版本:

REM open a regular old cmd.exe and run these 3
REM this builds the X64 version of the exe

cd "C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Samples\C++\XACT\Tutorials\Tut02_Stream"

"C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.Cmd" /debug /x64 /2003

"C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe" Tut02_Stream_2010.sln /p:Configuration=Debug /p:Platform=X64

答案 21 :(得分:0)

对我来说,这是由于PATH环境变量设置为我的用户个人资料的空值引起的。系统变量设置正确,所以我从我的个人资料中删除了空白PATH变量,一切都恢复了。

答案 22 :(得分:0)

当我安装了创建用户环境PATH变量的东西时,我遇到了这个问题。我的TeamCity构建代理在我自己的用户名下作为服务运行,它找到了用户PATH变量而不是机器PATH变量。使用错误的路径变量,它找不到任何东西,并给出了这个错误。

答案 23 :(得分:0)

尝试在构建计算机上通过powershell运行发布过程时,我遇到了同样的错误。

我的构建计算机只安装了Windows SDK而不是Visual Studio,因此我看起来缺少安装Visual Studio时通常存在的一些常见文件和注册表值。在仔细研究了vsvars32.bat之后,我注意到它正在报告位于GetVSCommonToolsDir标签下的“无法确定VS Common Tools文件夹的位置”错误。看来在这个批处理文件中,由于我的机器上不存在VS7子密钥,它会清空%VS100COMNTOOLS%环境变量并报告指定的错误。

在我的情况下,似乎我发生了这个错误,因为我的构建计算机上没有安装Visual Studio或其他必要的组件,因此注册表项不存在。也许您的错误是由于类似的东西,如32位与64位注册表或32位与64位VS命令提示符?直接在命令提示符中测试从批处理中失败的代码行应该可以为您提供有关为何未正确解析注册表或文件路径的线索。