PowerShell & Visual Studio Command Prompt : plusieurs solutions, dont une très simple (ok, pour paresseux)
Comme vous le savez, lancer depuis un prompt PowerShell le bat "vcvarsall.bat" correspondant aux raccourcis "Visual Studio 2005 Command Prompt" ou "Visual Studio 2008 Command Prompt" ne suffit pas à disposer de l'environnement souhaité dans ce prompt PS.
En effet, ce bat ne fait basiquement que lancer d'autres bat (vcvars32.bat, vcvarsamd64.bat, vcvarsia64.bat, vcvarsx86_amd64.bat ou vcvarsx86_ia64.bat suivant la config choisie), dont le but est simplement d'enrichir les variables d'environnement nécessaires (du moins c'est le cas pour vcvars32.bat).
Seulement, ces affectations ne survivent pas en dehors de l'execution du bat, elles n'impactent pas celles définies dans PowerShell.
Il y a donc plusieurs solutions au problème :
- La première est de redévelopper ces fameux bat en script PowerShell qui vont se charger d'enrichir directement les variables env:*, comme l'a fait Brad Wilson avec son script vsvars2008.ps1 qu'il a eu la gentillesse de partager avec nous.
- La seconde est tout simplement de continuer à utiliser les bat existants, qui doivent probablement être générés durant le setup de Visual Studio, et en recopiant les valeurs des variables d'environnement en fin d'execution dans notre session PowerShell :-)
Détaillons cette seconde solution, je sens qu'elle vous intéresse.
Le raccourci "Visual Studio 2005 Command Prompt" ne consiste qu'en ceci :
%comspec% /k ""C:\Program Files\Microsoft Visual Studio 8\VC\vcvarsall.bat"" x86
Or, cmd.exe peut prendre plusieurs commandes, en les séparant par &&, ce qui vas nous permettre d'executer set afin d'obtenir la liste des variables d'environnement définies dans le contexte de l'exection de cmd.
Ensuite, il ne nous reste qu'à parser ces informations pour définir ces mêmes variables dans notre prompt PowerShell.
Pour Visual Studio 2005 en x86, ça donne ceci :
cmd.exe /c "`"C:\Program Files\Microsoft Visual Studio 8\VC\vcvarsall.bat`" x86&&set" |
foreach {
if($_ -match "^(.*?)=(.*)$")
{
Set-Content "env:\$($matches[1])" $matches[2]
}
}
La seule chose changeant pour VS2008 étant le chemin d'accès au fichier vcvarsall.bat :
cmd.exe /c "`"C:\Program Files\Microsoft Visual Studio 9.0\VC\vcvarsall.bat`" x86&&set" |
foreach {
if($_ -match "^(.*?)=(.*)$")
{
Set-Content "env:\$($matches[1])" $matches[2]
}
}
Maintenant, concernant le fait d'ajouter ça au profil du shell PowerShell, pourquoi pas, si vous êtes sûr de ne plus vouloir utiliser que la dernière version de outils.
Personnellement, j'ai préférer garder 2 fichiers séparés vcvarsall_vs2005.ps1 et vcvarsall_vs2008.ps1 que je fais executer par 2 raccourcis qui vont bien, clonés du raccourci PS par défaut :
Visual Studio 2005 PowerShell Prompt : %SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe -NoExit &(Join-Path (Split-Path $PROFILE) 'Dev\vcvarsall_vs2005.ps1')
Visual Studio 2008 PowerShell Prompt : %SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe -NoExit &(Join-Path (Split-Path $PROFILE) 'Dev\vcvarsall_vs2008.ps1')
Mes deux fichiers ps1 sont placés dans un répertoire Dev placé dans le répertoire de mon profil PS, d'où la forme Join-Path (Split-Path $PROFILE) 'Dev\fichier.ps1' du raccourci.
D'ailleurs si vous voulez éviter les fichiers ps1, vous pouvez très bien "one-liné" leur contenu et vous en servir avec le paramètre -Command, mais bon courage ;-)
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :