Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I use PowerShell with the Visual Studio Command Prompt?

I've been using Beta 2 for a while now and it's been driving me nuts that I have to punt to cmd.exe when running the Visual Studio 2010 Command Prompt. I used to have a nice vsvars2008.ps1 script for Visual Studio 2008. Is there a vsvars2010.ps1 script or something similar?

like image 657
Andy S Avatar asked Jan 23 '10 21:01

Andy S


People also ask

How do I access PowerShell in Visual Studio?

You can open the interactive window by pressing Ctrl+Shift+\ or by navigating to View \ PowerShell \ PowerShell Interactive Window.

Can you run PowerShell from command prompt?

To start a Windows PowerShell session in a Command Prompt window, type PowerShell . A PS prefix is added to the command prompt to indicate that you are in a Windows PowerShell session.


2 Answers

Stealing liberally from blog post Replace Visual Studio Command Prompt with PowerShell, I was able to get this to work. I added the following to my profile.ps1 file and all is well with the world.

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 

This has worked well for years - until Visual Studio 2015. vcvarsall.bat no longer exists. Instead, you can use the vsvars32.bat file, which is located in the Common7\Tools folder.

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 

Things have changed yet again for Visual Studio 2017. vsvars32.bat appears to have been dropped in favor of VsDevCmd.bat. The exact path may vary depending on which edition of Visual Studio 2017 you're using.

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 

You can also make the split create just two items to avoid breaking values including the equal sign, which is also the separator of the environment variable name and the value:

$v = $_.split("=", 2); set-item -force -path "ENV:\$($v[0])"  -value  

Minor Changes for Visual Studio 2022, now that it's 64-bit.

pushd "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\Tools" cmd /c "VsDevCmd.bat&set" | foreach {   if ($_ -match "=") {     $v = $_.split("=", 2); set-item -force -path "ENV:\$($v[0])"  -value "$($v[1])"    } } popd Write-Host "`nVisual Studio 2022 Command Prompt variables set." -ForegroundColor Yellow 
like image 149
Andy S Avatar answered Sep 27 '22 23:09

Andy S


The simplest option is to run the VS 2010 command prompt and then start PowerShell.exe. If you really want to do this from your "home" PowerShell prompt, the approach you show is the way to go. I use a script that Lee Holmes wrote a while back:

<# .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 } 

Note: this function will be available in the PowerShell Community Extensions 2.0 module-based release coming soon.

like image 26
Keith Hill Avatar answered Sep 27 '22 23:09

Keith Hill