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?
Réponses
Trop de publicités?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
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.
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
}
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