2010-01-23 3 views
94

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

ответ

169

Крадущий свободно отсюда: 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 
+0

Я сделал то же самое, и это работало нормально. –

+0

Я согласен - это тоже отлично сработало для меня. Мне также пришлось изменить путь к визуальной студии в Program Files (не x86), так как я не на 64-битной системе. – czuroski

+6

Просто обратите внимание, что этот же метод работает для Visual Studio 2012. Просто измените «Microsoft Visual Studio 10.0» на «Microsoft Visual Studio 11.0» –

24

Самый простой вариант - запустить командную строку 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 Community Extensions 2,0 в ближайшее время.

2

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

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 
16

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

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

Вот мой последний код - обратите внимание на использование нежирного квантора в регулярном выражении для обработки любых возможных значений вложенных значений. Это также упрощает код: одно совпадение вместо совпадения, затем разбивается, как в примере Энди, либо на совпадение, а затем индексирует и подстроки, как в примере «я».

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

Для PowerShell 2.0 совместимость секции param требует '[parameter (Обязательный = $ true,' ... – sakra

+1

Приятный, но будет лучше с помощью pushd/popd. Просто используйте что-то вроде 'cmd/c" "" $ targetDir \ vcvarsall.bat «& set» ' – stijn

9

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

оригинальный ярлык что-то вроде этого:

%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

+0

Простой и работает как шарм. Этот ответ заслуживает большего внимания. –

+1

Единственное, что мне не нравится в этом, заключается в том, что он сохраняет загруженный процесс cmd.exe. Кроме этого это приятное решение – orad

5

Кит уже упоминалось PowerShell Community Extensions (PSCX), с Invoke-BatchFile команды:

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

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

Import-VisualStudioVars -VisualStudioVersion 2013 
+4

Начиная с PSCX 3.2.0, VS 2015 не поддерживается в этом командлете. Я открыл для него [issue] (https://pscx.codeplex.com/workitem/43203). – orad

0

Я хотел бы передать команды в детской оболочки, так как:

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

или в качестве альтернативы

cmd /c "`"${env:VS140COMNTOOLS}..\..\VC\vcvarsall.bat`" amd64 && <someCommand> && <someOtherCommand>" 
Смежные вопросы