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

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

Ответы [ 7 ]

208 голосов
/ 24 января 2010

Кража отсюда: http://allen -mack.blogspot.com / 2008/03 / replace-visual-studio-command-prompt.html , я смог заставить это работать Я добавил следующее в свой profile.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
25 голосов
/ 24 января 2010

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

<#
.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 * Скоро выйдет релиз для модуля 1005 * 2.0.

17 голосов
/ 29 января 2015

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

Оригинальный ярлык выглядит примерно так:

%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, перейдите на вкладку Цвета в свойствах ярлыков и установите для значений Red, Green и Blue значения 1, 36 и 86 соответственно.

screenshot

16 голосов
/ 09 февраля 2014

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

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

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

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

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

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

Import-VisualStudioVars -VisualStudioVersion 2013
3 голосов
/ 28 января 2014

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

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

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

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

Я исправил это, изменив скрипт моего профиля следующим образом:

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 голосов
/ 16 октября 2016

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

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

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

cmd /c "`"${env:VS140COMNTOOLS}..\..\VC\vcvarsall.bat`" amd64 && <someCommand> && <someOtherCommand>"  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...