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

前端 未结 9 1592
一向
一向 2020-12-02 03:44

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 VS2010 Command Prompt. I used to have a nice vsvars200

相关标签:
9条回答
  • 2020-12-02 04:19

    I found a simple method here: modify the shortcut.

    The original shortcut is something like this:

    %comspec% /k ""C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\VsDevCmd.bat""
    

    Add & powershell before the last quote, like this:

    %comspec% /k ""C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\VsDevCmd.bat" & powershell"
    

    If you want to make it look more like PS, go to the Colors tab of the shortcut properties and set the Red, Green and Blue values to 1, 36 and 86 respectively.

    screenshot

    0 讨论(0)
  • 2020-12-02 04:23

    Kudos to Andy S for his answer. I've been using his solution for a while, but ran into a problem today. Any value that has an equals sign in it is truncated at the equals sign. For example, I had:

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

    But my PS session reported:

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

    I fixed this by modifying my profile script to the following:

    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
    
    0 讨论(0)
  • 2020-12-02 04:26

    Keith has already mentioned PowerShell Community Extensions (PSCX), with its Invoke-BatchFile command:

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

    I also noticed that PSCX also has an Import-VisualStudioVars function:

    Import-VisualStudioVars -VisualStudioVersion 2013
    
    0 讨论(0)
  • 2020-12-02 04:28

    I like to pass the commands into a child shell like so:

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

    Or alternatively

    cmd /c "`"${env:VS140COMNTOOLS}..\..\VC\vcvarsall.bat`" amd64 && <someCommand> && <someOtherCommand>"  
    
    0 讨论(0)
  • 2020-12-02 04:30

    As an extension to Andy S's answer above, this is updated for VS 2019 community. However, I also needed 64-bit, so this includes the -arch=amd64 and -host_arch=amd64 flags as well for anyone that needs them.

    pushd "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\Tools"
    cmd /c "VsDevCmd.bat -arch=amd64 -host_arch=amd64&set " |
    foreach {
      if ($_ -match "=") {
        $v = $_.split("="); set-item -force -path "ENV:\$($v[0])"  -value "$($v[1])"
      }
    }
    popd
    Write-Host "`nVisual Studio 2019 Command Prompt variables set." -ForegroundColor Yellow
    
    0 讨论(0)
  • 2020-12-02 04:33

    An old question but worth another answer to (a) provide VS2013 suppport; (b) combine the best of two previous answers; and (c) provide a function wrapper.

    This builds on @Andy's technique (which builds on Allen Mack's technique as Andy indicated (which in turn builds on Robert Anderson's technique as Allen indicated (all of which had a slight glitch as indicated on this page by the user known only as "me--", so I took that into account as well))).

    Here is my final code--note the use of the non-greedy quantifier in the regex to handle any possible embedded equals in the values. That also happens to simplify the code: a single match instead of a match then split as in Andy's example or a match then indexof and substrings as in "me--"'s example).

    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
    }
    
    0 讨论(0)
提交回复
热议问题