从PowerShell设置Visual Studio环境变量

7
我已经安装了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.bitvcvars64.bit所做的一切都是设置环境变量,但似乎仅在cmd.exe中有效,而不是在PowerShell中。

2个回答

10
您应该使用InvokeEnvironment脚本来完成此操作。请查看其手册页面:
Invoke-Environment <path_to_>vsvars32.bat

你可以进一步概括,确定操作系统位数并编写vsvars<OsBits>.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;

1
谢谢,但似乎不起作用。我按照你的README.md中描述的方式将其添加到我的配置文件中,但仍然找不到Invoke-Environment命令。当使用完全限定路径调用脚本时,它可以找到脚本,但似乎无法运行我传递为参数的批处理脚本,因为没有输出,并且也没有正确设置环境变量。 - Andreas
你不必这么做。只需将函数复制/粘贴到你的活动 shell 中即可。我在许多项目中使用了这个函数,所以它是有效的。它没有输出,要查看它是否有效,请检查 $Env: 中是否存在变量。 - majkinetor
仍然无法工作。在你的例子中,VS100COMNTOOLS是什么?这是一个环境变量吗?这里没有设置它。vsvarsXXX.bat脚本在这里:C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin - Andreas
好的,现在它可以工作了。我忘记了“.\”前缀。非常感谢!虽然我仍然困惑于PowerShell对于这样一个微不足道的事情竟然没有“内部解决方案”... - Andreas
这与Powershell无关。cmd.exe只是Posh的另一个shell,它是否也支持bash变量? - majkinetor
显示剩余8条评论

0

我手头没有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环境变量吗? - Andreas
可以的。请查看我的答案。 - majkinetor
运行批处理脚本,回显CMD环境,解析输出,然后在PowerShell环境中创建相应的变量。这并不完全是“在PowerShell中运行批处理脚本,以便它可以修改PowerShell环境”,但可能足够接近。 - Ansgar Wiechers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接