Respostas:
Roubando livremente daqui: http://allen-mack.blogspot.com/2008/03/replace-visual-studio-command-prompt.html , consegui fazer isso funcionar. Adicionei o seguinte ao meu profile.ps1 e está tudo bem com o mundo.
pushd 'c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC'
cmd /c "vcvarsall.bat&set" |
foreach {
if ($_ -match "=") {
$v = $_.split("="); set-item -force -path "ENV:\$($v[0])" -value "$($v[1])"
}
}
popd
write-host "`nVisual Studio 2010 Command Prompt variables set." -ForegroundColor Yellow
Isso funcionou bem por anos - até o Visual Studio 2015. vcvarsall.bat não existe mais. Em vez disso, você pode usar o arquivo vsvars32.bat, que está localizado na pasta Common7 \ Tools.
pushd 'C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools'
cmd /c "vsvars32.bat&set" |
foreach {
if ($_ -match "=") {
$v = $_.split("="); set-item -force -path "ENV:\$($v[0])" -value "$($v[1])"
}
}
popd
write-host "`nVisual Studio 2015 Command Prompt variables set." -ForegroundColor Yellow
As coisas mudaram mais uma vez para o Visual Studio 2017. vsvars32.bat
parece ter sido abandonado em favor de VsDevCmd.bat
. O caminho exato pode variar dependendo de qual edição do Visual Studio 2017 você está usando.
pushd "C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\Tools"
cmd /c "VsDevCmd.bat&set" |
foreach {
if ($_ -match "=") {
$v = $_.split("="); set-item -force -path "ENV:\$($v[0])" -value "$($v[1])"
}
}
popd
Write-Host "`nVisual Studio 2017 Command Prompt variables set." -ForegroundColor Yellow
echo $Profile
para ver o caminho pretendido para o seu profile.ps1, se você nunca o criou
A opção mais simples é executar o prompt de comando do VS 2010 e, em seguida, iniciar o PowerShell.exe. Se você realmente deseja fazer isso de seu prompt do PowerShell "inicial", a abordagem que você mostra é o caminho a percorrer. Eu uso um script que Lee Holmes escreveu há algum tempo:
<#
.SYNOPSIS
Invokes the specified batch file and retains any environment variable changes
it makes.
.DESCRIPTION
Invoke the specified batch file (and parameters), but also propagate any
environment variable changes back to the PowerShell environment that
called it.
.PARAMETER Path
Path to a .bat or .cmd file.
.PARAMETER Parameters
Parameters to pass to the batch file.
.EXAMPLE
C:\PS> Invoke-BatchFile "$env:VS90COMNTOOLS\..\..\vc\vcvarsall.bat"
Invokes the vcvarsall.bat file to set up a 32-bit dev environment. All
environment variable changes it makes will be propagated to the current
PowerShell session.
.EXAMPLE
C:\PS> Invoke-BatchFile "$env:VS90COMNTOOLS\..\..\vc\vcvarsall.bat" amd64
Invokes the vcvarsall.bat file to set up a 64-bit dev environment. All
environment variable changes it makes will be propagated to the current
PowerShell session.
.NOTES
Author: Lee Holmes
#>
function Invoke-BatchFile
{
param([string]$Path, [string]$Parameters)
$tempFile = [IO.Path]::GetTempFileName()
## Store the output of cmd.exe. We also ask cmd.exe to output
## the environment table after the batch file completes
cmd.exe /c " `"$Path`" $Parameters && set > `"$tempFile`" "
## Go through the environment variables in the temp file.
## For each of them, set the variable in our local environment.
Get-Content $tempFile | Foreach-Object {
if ($_ -match "^(.*?)=(.*)$")
{
Set-Content "env:\$($matches[1])" $matches[2]
}
}
Remove-Item $tempFile
}
Observação: esta função estará disponível na versão baseada em módulo PowerShell Community Extensions 2.0 em breve.
Encontrei um método simples aqui : modificar o atalho.
O atalho original é mais ou menos assim:
%comspec% /k ""C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\VsDevCmd.bat""
Adicione & powershell
antes da última citação, assim:
%comspec% /k ""C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\VsDevCmd.bat" & powershell"
Se você quiser torná-lo mais parecido com PS, vá para a guia Cores das propriedades do atalho e defina os valores de Vermelho, Verde e Azul para 1, 36 e 86 respectivamente.
Uma pergunta antiga, mas vale outra resposta para (a) fornecer suporte VS2013; (b) combinar o melhor de duas respostas anteriores; e (c) fornecer um wrapper de função.
Isso se baseia na técnica de @Andy (que se baseia na técnica de Allen Mack conforme Andy indicou (que por sua vez se baseia na técnica de Robert Anderson conforme Allen indicou (todos os quais tiveram uma pequena falha, conforme indicado nesta página pelo usuário conhecido apenas como "eu- - ", então eu levei isso em consideração também))).
Aqui está meu código final - observe o uso do quantificador não ganancioso na regex para lidar com qualquer igual embutido nos valores. Isso também simplifica o código: uma única correspondência em vez de uma correspondência e então dividida como no exemplo de Andy ou uma correspondência e indexof e substrings como no exemplo de "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
}
[parameter(Mandatory=$true,
...
cmd /c """$targetDir\vcvarsall.bat""&set"
Keith já mencionou PowerShell Community Extensions (PSCX), com seu Invoke-BatchFile
comando:
Invoke-BatchFile "${env:ProgramFiles(x86)}\Microsoft Visual Studio 12.0\VC\vcvarsall.bat"
Também percebi que o PSCX também tem uma Import-VisualStudioVars
função:
Import-VisualStudioVars -VisualStudioVersion 2013
Parabéns a Andy S por sua resposta. Estou usando a solução dele há um tempo, mas tive um problema hoje. Qualquer valor com um sinal de igual é truncado no sinal de igual. Por exemplo, eu tinha:
JAVA_TOOL_OPTIONS=-Duser.home=C:\Users\Me
Mas minha sessão PS relatou:
PS C:\> $env:JAVA_TOOL_OPTIONS
-Duser.home
Corrigi isso modificando meu script de perfil para o seguinte:
pushd 'c:\Program Files (x86)\Microsoft Visual Studio 11.0\VC'
cmd /c "vcvarsall.bat&set" |
foreach {
if ($_ -match "=") {
$i = $_.indexof("=")
$k = $_.substring(0, $i)
$v = $_.substring($i + 1)
set-item -force -path "ENV:\$k" -value "$v"
}
}
popd
Para alguém que ainda está lutando com isso em 2020 e no Visual Studio Code 1.41.1, um pouco fora do assunto aqui.
Usando todas as diferentes partes do código acima e da Internet, por exemplo, de https://help.appveyor.com/discussions/questions/18777-how-to-use-vcvars64bat-from-powershell e com uma abordagem passo a passo consegui tenha o script abaixo funcionando.
Salvo no VSCode "settings.json" e com a extensão Code Runner instalada.
Com o Microsoft (R) C / C ++ Otimizando Compiler Versão "cl.exe" do Visual Studio 2015 / 14.0:
"code-runner.runInTerminal": true,
"code-runner.executorMap": {
"cpp": "cd $dir; pushd \"C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\"; cmd.exe /c \"call vcvarsall.bat x86_amd64 & set > %temp%\\vcvars.txt\"; Get-Content \"$env:temp\\vcvars.txt\" | Foreach-Object { if ($_ -match \"^(.*?)=(.*)$\") { Set-Content \"env:\\$($matches[1])\" $matches[2] }}; popd; cls; cl *.cpp; .\\\"$fileNameWithoutExt.exe\"; Write-Host -NoNewLine 'Press any key to continue...'; $null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown'); del \"$fileNameWithoutExt.exe\"; del \"$fileNameWithoutExt.obj\""}
Com Microsoft (R) C / C ++ Optimizing Compiler versão "cl.exe" do Visual Studio 2019 / 16.4.3:
"code-runner.runInTerminal": true,
"code-runner.executorMap": {
"cpp": "cd $dir; pushd \"c:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\VC\\Auxiliary\\Build\"; cmd.exe /c \"call vcvarsall.bat x86_amd64 & set > %temp%\\vcvars.txt\"; Get-Content \"$env:temp\\vcvars.txt\" | Foreach-Object { if ($_ -match \"^(.*?)=(.*)$\") { Set-Content \"env:\\$($matches[1])\" $matches[2] }}; popd; cls; cl *.cpp; .\\\"$fileNameWithoutExt.exe\"; Write-Host -NoNewLine 'Press any key to continue...'; $null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown'); del \"$fileNameWithoutExt.exe\"; del \"$fileNameWithoutExt.obj\""}
HTH
Eu gosto de passar os comandos para um shell filho assim:
cmd /c "`"${env:VS140COMNTOOLS}vsvars32.bat`" && <someCommand>"
Ou alternativamente
cmd /c "`"${env:VS140COMNTOOLS}..\..\VC\vcvarsall.bat`" amd64 && <someCommand> && <someOtherCommand>"