Como posso usar o PowerShell com o prompt de comando do Visual Studio?

Eu tenho usado o Beta 2 por um tempo agora e isso tem me deixado louco que eu tenho que punt para cmd.exe ao executar o Prompt de Comando VS2010. Eu costumava ter um bom script vsvars2008.ps1 para o Visual Studio 2008. Alguém tem um vsvars2010.ps1 ou algo semelhante?

Roubando liberalmente daqui: http://allen-mack.blogspot.com/2008/03/replace-visual-studio-command-prompt.html , pude fazer isso funcionar. Eu 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 durante anos – até o Visual Studio 2015. O vcvarsall.bat não existe mais. Em vez disso, você pode usar o arquivo vsvars32.bat, 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 descartado 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 

A opção mais simples é executar o prompt de comando do VS 2010 e iniciar o PowerShell.exe. Se você realmente quiser fazer isso a partir do seu prompt “inicial” do PowerShell, 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 } 

Nota: esta function estará disponível na versão baseada em módulo do PowerShell Community Extensions 2.0 em breve.

Uma pergunta antiga, mas vale outra resposta para (a) fornecer suporte ao VS2013; (b) combinar o melhor de duas respostas anteriores; e (c) fornecer um invólucro de function.

Isso se baseia na técnica de @ Andy (que se baseia na técnica de Allen Mack, como Andy indicou (que, por sua vez, baseia-se na técnica de Robert Anderson, como Allen indicou). – “, então eu levei isso em conta também))).

Aqui está o meu código final – observe o uso do quantificador não-guloso na regex para manipular quaisquer possíveis iguais incorporados nos valores. Isso também simplifica o código: uma única correspondência em vez de uma correspondência é dividida como no exemplo de Andy ou uma correspondência, em seguida, indexof e substrings como no exemplo “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 } 

Eu encontrei um método simples aqui : modifique o atalho.

O atalho original é algo 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 fazer com que pareça mais com PS, vá para a guia Cores das propriedades de atalho e defina os valores Vermelho, Verde e Azul para 1, 36 e 86, respectivamente.

captura de tela

Keith já mencionou o PowerShell Community Extensions (PSCX), com seu comando Invoke-BatchFile :

 Invoke-BatchFile "${env:ProgramFiles(x86)}\Microsoft Visual Studio 12.0\VC\vcvarsall.bat" 

Eu também notei que o PSCX também possui uma function Import-VisualStudioVars :

 Import-VisualStudioVars -VisualStudioVersion 2013 

Muitos elogios para Andy S por sua resposta. Eu tenho usado a solução dele por um tempo, mas tive um problema hoje. Qualquer valor que tenha um sinal de igual é truncado no sinal de igual. Por exemplo, eu tive:

 JAVA_TOOL_OPTIONS=-Duser.home=C:\Users\Me 

Mas minha session de PS relatou:

 PS C:\> $env:JAVA_TOOL_OPTIONS -Duser.home 

Eu consertei 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 

Eu gosto de passar os comandos para um shell filho assim:

 cmd /c "`"${env:VS140COMNTOOLS}vsvars32.bat`" && " 

Ou alternativamente

 cmd /c "`"${env:VS140COMNTOOLS}..\..\VC\vcvarsall.bat`" amd64 &&  && " 
Intereting Posts