web-dev-qa-db-ja.com

PowerShellをVisual Studioコマンドプロンプトで使用するにはどうすればよいですか?

私はしばらくの間Beta 2を使用してきましたが、VS2010コマンドプロンプトを実行するときにcmd.exeをパントする必要があることに気がつきました。以前、Visual Studio 2008用のニースvsvars2008.ps1スクリプトを使用していました。vsvars2010.ps1または類似のものはありますか?

115
Andy S

ここから自由に盗む: 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はもう存在しません。代わりに、Common7\Toolsフォルダーにあるvsvars32.batファイルを使用できます。

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
211
Andy S

最も簡単なオプションは、VS 2010コマンドプロンプトを実行し、PowerShell.exeを起動することです。 「ホーム」PowerShellプロンプトからこれを本当に行いたい場合は、表示するアプローチがその方法です。 Lee Holmesがしばらく前に書いたスクリプトを使用します。

<#
.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モジュールベースのリリースで利用可能になります。

25
Keith Hill

簡単な方法を見つけました 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のように見せたい場合は、ショートカットプロパティのColorsタブに移動し、赤、緑、青の値を1に設定します。それぞれ36および86。

screenshot

17
user247702

古い質問ですが、(a)VS2013サポートを提供する別の回答に値します。 (b)2つの以前の回答のベストを組み合わせます。 (c)関数ラッパーを提供します。

これは@Andyの手法(Andyが示したAllen Mackの手法を基に構築されています(これは、次にAllenが示したRobert Andersonの手法を基に構築されています) -"、だからそれも考慮に入れた)))。

これが私の最後のコードです。正規表現で貪欲でない数量詞を使用して、値に埋め込まれている可能性のある等しい値を処理することに注意してください。それはまた、コードを単純化するために起こります:マッチの代わりに単一のマッチがAndyの例のように分割されるか、マッチの後にindexofとsubstringsが「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
}
16
Michael Sorens

キースは既にInvoke-BatchFileコマンドでPowerShell Community Extensions(PSCX)について言及しています:

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

また、PSCXにはImport-VisualStudioVars関数もあることに気付きました。

Import-VisualStudioVars -VisualStudioVersion 2013
9
Tahir Hassan

アンディ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
3
me--

私は次のように子シェルにコマンドを渡すのが好きです:

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

または代わりに

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