【问题标题】:Setting up Visual Studio environment variables from PowerShell [duplicate]从 PowerShell 设置 Visual Studio 环境变量 [重复]
【发布时间】:2016-04-04 10:34:00
【问题描述】:

我已安装 Visual Studio 9.0,但我想从 PowerShell 手动使用它。它带有两个设置脚本:vcvars32.bat 用于 32 位编译器,vcvars64.bat 用于 64 位编译器。当我打开cmd.exe 并运行其中一个脚本时,它设置的一切都很好,我可以毫无问题地运行cl.exe。但是,当我从 PowerShell 运行其中一个设置脚本时,它不起作用。脚本运行良好,但尝试运行 cl.exe 之后会产生“cl.exe 找不到”错误!在运行一个设置脚本后查看PATH 环境变量的内容,我可以看到PATH 实际上根本没有被修改。

因此,从 PowerShell 运行的批处理文件似乎维护了它们自己的环境变量状态,一旦批处理文件终止,该状态就会消失。那么有没有办法从 PowerShell 运行批处理文件并让这些批处理文件影响当前 PowerShell 会话的实际环境变量?因为那是我需要的。 vcvars32.bit 和 vcvars64.bit 所做的一切毕竟是设置环境变量,但它似乎只能在 cmd.exe 中工作,而不是在 PowerShell 中。

【问题讨论】:

    标签: powershell batch-file visual-studio-2012 cmd


    【解决方案1】:

    您应该使用InvokeEnvironment 脚本来执行此操作。查看其手册页:

    Invoke-Environment <path_to_>vsvars32.bat
    

    您可以通过确定操作系统位和制作vsvars&lt;OsBits&gt;.bat 来进一步概括这一点。

    例子:

    PS C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools> $env:INCLUDE -eq $null
    PS C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools> $true
    PS C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools> Invoke-Environment .\vsvars32.bat
    PS C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools> $env:INCLUDE
    C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE;C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\ATLMFC\INCLUDE;C:\Program Files (x86)\Windows Kits\10\include\10.0.10586.0\ucrt;C:\Program Files (x86)\Windows Kits\NETFXSDK\4.6.1\include\um;C:\Program Files (x86)\Windows Kits\10\include\10.0.10586.0\shared;C:\Program Files (x86)\Windows Kits\10\include\10.0.10586.0\um;C:\Program Files (x86)\Windows Kits\10\include\10.0.10586.0\winrt;
    

    【讨论】:

    • 谢谢,但它似乎不起作用。我按照您的README.md 中的说明将其添加到我的个人资料中,但仍然找不到Invoke-Environment 命令。使用完全限定路径调用脚本时,它会找到脚本,但似乎没有运行我作为参数传递的批处理脚本,因为没有输出并且它也没有正确设置环境变量。
    • 你不必做所有这些。只需将函数复制/粘贴到您的活动外壳中即可。我在项目数量上使用了该功能,因此它可以工作。它没有输出,看看它是否工作检查变量是否存在于$Env:
    • 还是不行。在您的示例中,VS100COMNTOOLS 是什么?这是环境变量吗?这里没有设置。 vsvarsXXX.bat 脚本位于 C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin 此处。
    • 你为什么不直接进入你提到的那个文件夹并执行Invoke-Environment vsvars64.bat ?
    • 当然,我也尝试过,但它不起作用。它只是打印,什么都不做。并且环境变量保持不变。问题是否与我仍在使用 PowerShell 1.0 的事实有关?
    【解决方案2】:

    我手头没有 Visual Studio,但批处理脚本很可能只是为当前会话设置变量。从 PowerShell 运行它们对您没有任何好处,因为它们将在子 CMD 进程中启动并更改该进程的进程环境,但不会更改父 (PowerShell) 进程的进程环境。

    我怀疑您需要将变量定义转换为 PowerShell,例如

    set PATH=%PATH%;C:\some\where
    set FOO=bar
    

    变成

    $env:Path += ';C:\some\where'
    $env:FOO = 'bar'
    

    将翻译后的定义写入 .ps1 文件并在 PowerShell 会话中对该文件进行点源:

    . C:\path\to\vcvars.ps1
    

    【讨论】:

    • 嗯,为 PowerShell 重写那些批处理脚本当然是我想避免的。真的没有办法在 PowerShell 上下文中运行批处理脚本,以便修改 PowerShell 环境变量吗?
    • 有可能。检查我的答案
    • 运行批处理脚本,回显 CMD 环境,解析输出,然后在 PowerShell 环境中创建相应的变量。这并不完全是“在 PowerShell 中运行批处理脚本,以便它可以修改 PowerShell 环境”,但可能已经足够接近了。
    猜你喜欢
    • 1970-01-01
    • 2014-01-21
    • 2011-02-08
    • 2011-03-04
    • 2015-10-11
    • 1970-01-01
    • 1970-01-01
    • 2019-10-22
    • 2020-09-29
    相关资源
    最近更新 更多