137 votes

Comment je peux l'utiliser PowerShell avec l'Invite de Commande Visual Studio?

J'ai été en utilisant la version Bêta 2 pour un certain temps maintenant et ça me rend fou que j'ai de pount à cmd.exe lors de l'exécution de la VS2010 Invite de Commande. J'ai utilisé pour avoir un joli vsvars2008.ps1 script pour Visual Studio 2008. Quelqu'un a une vsvars2010.ps1 ou quelque chose de similaire?

238voto

Andy S Points 3975

Voler librement ici: http://allen-mack.blogspot.com/2008/03/replace-visual-studio-command-prompt.htmlj'ai pu obtenir que cela fonctionne. J'ai ajouté ce qui suit à mon profil.ps1 et tout va bien avec le monde.

#Set environment variables for Visual Studio Command Prompt
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

29voto

Keith Hill Points 73162

L'option la plus simple est de lancer le VS 2010 invite de commande, puis commencer à PowerShell.exe. Si vous voulez vraiment le faire à partir de votre "maison" invite de PowerShell, l'approche de vous montrer, c'est le chemin à parcourir. J'utilise un script qui Lee Holmes a écrit un tout à l'arrière:

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

Remarque: cette fonction sera disponible dans la PowerShell de la Communauté des Extensions 2.0 module de base de libération à venir.

17voto

Michael Sorens Points 9637

Une vieille question, mais qui en vaut une autre réponse à (a) fournir des VS2013 soutien; (b) combiner le meilleur des deux réponses précédentes; et (c) fournir une fonction wrapper.

Cela s'appuie sur @Andy technique (qui s'appuie sur Allen Mack technique comme Andy (qui à son tour s'appuie sur Robert Anderson technique comme Allen a indiqué (qui avait un léger défaut comme indiqué sur cette page par l'utilisateur, connu seulement comme "moi", alors j'ai pris ça en compte aussi bien))).

Voici mon code final: à noter l'utilisation de la non-greedy quantificateur dans la regex pour gérer d'éventuelles intégré est égal à dans la les valeurs. Que se passe aussi pour simplifier le code: un seul match à la place d'un match, alors réparti comme dans d'Andy exemple, ou d'un match, alors indexof et des sous-chaînes comme dans "moi--"'s exemple).

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
}

3voto

me-- Points 196

Bravo à Andy S pour sa réponse. J'ai été en utilisant sa solution pour un certain temps, mais a couru dans un problème aujourd'hui. Toute valeur qui a un signe égal dans il est tronqué au signe égal. Par exemple, j'ai eu:

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

Mais mon PS session déclaré:

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

J'ai corrigé cela en modifiant mon script de profil à la suivante:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X