Comment puis-je utiliser PowerShell avec l’invite de commandes Visual Studio?

J’utilise la version bêta 2 depuis un certain temps et cela me rend fou de devoir lancer une commande sur cmd.exe lors de l’exécution de l’invite de commande VS2010. J’avais un beau script vsvars2008.ps1 pour Visual Studio 2008. Quelqu’un at-il un vsvars2010.ps1 ou quelque chose de similaire?

Voler librement ici: http://allen-mack.blogspot.com/2008/03/replace-visual-studio-command-prompt.html , j’ai pu faire fonctionner ceci. J’ai ajouté ce qui suit à mon profile.ps1 et tout va bien dans le monde.

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 

Cela a bien fonctionné pendant des années – jusqu’à ce que Visual Studio 2015. vcvarsall.bat n’existe plus. Au lieu de cela, vous pouvez utiliser le fichier vsvars32.bat, qui se trouve dans le dossier 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 

Les choses ont encore changé pour Visual Studio 2017. vsvars32.bat semble avoir été abandonné en faveur de VsDevCmd.bat . Le chemin exact peut varier selon l’édition de Visual Studio 2017 que vous utilisez.

 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 

L’option la plus simple consiste à exécuter l’invite de commande VS 2010, puis à démarrer PowerShell.exe. Si vous voulez vraiment le faire depuis votre invite PowerShell “maison”, l’approche que vous montrez est la voie à suivre. J’utilise un script que Lee Holmes a écrit il y a longtemps:

 <# .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([ssortingng]$Path, [ssortingng]$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 version basée sur le module PowerShell Community Extensions 2.0 à venir.

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

Cela se fonde sur la technique de @ Andy (qui s’appuie sur la technique d’Allen Mack telle qu’Andy l’indiquait (qui s’appuie sur la technique de Robert Anderson telle qu’Allen l’a indiqué (toutes celles de l’utilisateur connu sous le nom de «me- – “, alors j’en ai tenu compte aussi)).

Voici mon code final – notez l’utilisation du quantificateur non gourmand dans l’expression rationnelle pour traiter tous les égaux incorporés possibles dans les valeurs. Cela se produit également pour simplifier le code: une seule correspondance au lieu d’une correspondance, puis fractionnée comme dans l’exemple d’Andy ou une correspondance, puis indexof et les sous-chaînes comme dans l’exemple de “moi -“).

 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 } 

J’ai trouvé une méthode simple ici : modifier le raccourci.

Le raccourci original est quelque chose comme ceci:

 %comspec% /k ""C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\VsDevCmd.bat"" 

Ajoutez & powershell avant la dernière citation, comme ceci:

 %comspec% /k ""C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\VsDevCmd.bat" & powershell" 

Si vous voulez qu’il ressemble plus à PS, allez à l’onglet Couleurs des propriétés de raccourci et définissez les valeurs Rouge, Vert et Bleu à 1, 36 et 86 respectivement.

capture d'écran

Keith a déjà mentionné les extensions de communauté PowerShell (PSCX), avec sa commande Invoke-BatchFile :

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

J’ai également remarqué que PSCX possède également une fonction Import-VisualStudioVars :

 Import-VisualStudioVars -VisualStudioVersion 2013 

Bravo à Andy S pour sa réponse. J’utilise sa solution depuis un moment, mais j’ai rencontré un problème aujourd’hui. Toute valeur dont le signe est égal est tronquée au signe égal. Par exemple, j’ai eu:

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

Mais ma session PS a rapporté:

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

J’ai résolu ce problème en modifiant mon script de profil de la manière suivante:

 pushd 'c:\Program Files (x86)\Microsoft Visual Studio 11.0\VC' cmd /c "vcvarsall.bat&set" | foreach { if ($_ -match "=") { $i = $_.indexof("=") $k = $_.subssortingng(0, $i) $v = $_.subssortingng($i + 1) set-item -force -path "ENV:\$k" -value "$v" } } popd 

J’aime passer les commandes dans un shell enfant comme ceci:

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

Ou bien

 cmd /c "`"${env:VS140COMNTOOLS}..\..\VC\vcvarsall.bat`" amd64 &&  && "