Как я могу использовать PowerShell с командной строкой Visual Studio?

Я использую бета-версию 2 некоторое время, и это заставляло меня гадать, что я должен пнуть к cmd.exe при запуске командной строки VS2010. Раньше у меня был хороший vsvars2008.ps1 script для Visual Studio 2008. У кого-то есть vsvars2010.ps1 или что-то подобное?

Ответ 1

Крадусь отсюда: http://allen-mack.blogspot.com/2008/03/replace-visual-studio-command-prompt.html, я смог заставить это работать. Я добавил следующее к своему профилю .ps1, и все хорошо с миром.

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

Это хорошо работает уже много лет - до Visual Studio 2015. vcvarsall.bat больше не существует. Вместо этого вы можете использовать файл vsvars32.bat, который находится в папке 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

Все изменилось еще раз для Visual Studio 2017. vsvars32.bat похоже, был отброшен в пользу VsDevCmd.bat. Точный путь может варьироваться в зависимости от того, какую версию Visual Studio 2017 вы используете.

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

Ответ 2

Самый простой вариант - запустить командную строку VS 2010, а затем запустить PowerShell.exe. Если вы действительно хотите сделать это из своей "домашней" подсказки PowerShell, подход, который вы покажете, - это путь. Я использую script, который Ли Холмс написал некоторое время назад:

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

Примечание. Эта функция будет доступна в следующем выпуске PowerShell Community Extensions 2.0.

Ответ 3

Старый вопрос, но стоит другого ответа: (a) предоставить VS2013 suppport; (б) объединить лучшие из двух предыдущих ответов; и (c) предоставить оболочку функции.

Это основано на технике @Andy (которая основывается на технике Аллена Макса, как указал Энди (что, в свою очередь, основывается на технике Роберта Андерсона, как указал Аллен (все из которых имели небольшой сбой, как указано на этой странице пользователем, известным только как "я...", поэтому я тоже это учитывал))).

Вот мой последний код - обратите внимание на использование нежирного квантора в регулярном выражении для обработки любых возможных вложенных равных в значениях. Это также упрощает код: одно совпадение вместо совпадения, затем разбивается как в примере Энди, так и на совпадении, а затем индексирует и подстроки, как в примере "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
}

Ответ 4

Я нашел простой способ здесь: изменить ярлык.

Исходный ярлык выглядит примерно так:

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

Добавьте & powershell перед последней цитатой, например:

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

Если вы хотите, чтобы он больше напоминал PS, перейдите на вкладку "Цвета" свойств ярлыка и установите значения красного, зеленого и синего в значения 1, 36 и 86 соответственно.

screenshot

Ответ 5

Keith уже упоминал расширения сообщества PowerShell (PSCX) со своей командой Invoke-BatchFile:

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

Я также заметил, что PSCX также имеет функцию Import-VisualStudioVars:

Import-VisualStudioVars -VisualStudioVersion 2013

Ответ 6

Престижность Энди S за его ответ. Я использовал его решение на некоторое время, но столкнулся с проблемой сегодня. Любое значение, имеющее знак равенства в нем, усекается на знаке равенства. Например, у меня было:

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

Но моя сессия PS сообщила:

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

Я исправил это, изменив свой профиль script на следующее:

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

Ответ 7

Мне нравится передавать команды в дочернюю оболочку следующим образом:

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

Или, альтернативно,

cmd /c "`"${env:VS140COMNTOOLS}..\..\VC\vcvarsall.bat`" amd64 && <someCommand> && <someOtherCommand>"