Старый вопрос, но заслуживающий другого ответа, чтобы (а) обеспечить поддержку VS2013; (б) объединить лучшее из двух предыдущих ответов; и (c) предоставить функцию-обертку.
Это основано на методе @ Andy (которая основана на методике Аллена Мека, как указал Энди) (которая, в свою очередь, основана на методике Robert Anderson, как указано Allen) (все из которых имели небольшой сбой, как указано на этой странице пользователем, известным только как "я ...", так что я это тоже учел))).
Вот мой последний код - обратите внимание на использование не жадного квантификатора в регулярном выражении для обработки любых возможных встроенных равных в значениях. Это также происходит для упрощения кода: одно совпадение вместо совпадения затем разделяется, как в примере Энди, или совпадение, а затем indexof и подстроки, как в примере "me -").
function Set-VsCmd
{
param(
[parameter(Mandatory, HelpMessage="Enter VS version as 2010, 2012, or 2013")]
[ValidateSet(2010,2012,2013)]
[int]$version
)
$VS_VERSION = @{ 2010 = "10.0"; 2012 = "11.0"; 2013 = "12.0" }
$targetDir = "c:\Program Files (x86)\Microsoft Visual Studio $($VS_VERSION[$version])\VC"
if (!(Test-Path (Join-Path $targetDir "vcvarsall.bat"))) {
"Error: Visual Studio $version not installed"
return
}
pushd $targetDir
cmd /c "vcvarsall.bat&set" |
foreach {
if ($_ -match "(.*?)=(.*)") {
Set-Item -force -path "ENV:\$($matches[1])" -value "$($matches[2])"
}
}
popd
write-host "`nVisual Studio $version Command Prompt variables set." -ForegroundColor Yellow
}