J'ai beaucoup de solutions de projet Visual Studio dans plusieurs répertoires (tous avec l'extension .sln) et je souhaite écrire un script de traitement par lots simple qui générera automatiquement toutes les solutions répertoriées dans le fichier de traitement par lots.
Je peux créer manuellement une solution en démarrant le Visual Studio Command Prompt
(qui est simplement une instance de ligne de commande avec la commande suivante exécutée
"%comspec%" /k "C:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" x86
Après quoi, je construis le projet en appelant:
devenv "path\to\solutionFile\projectSolution1.sln" /build Debug
Cela construira le projet (en supposant que le projet ne comporte pas d’erreurs) et je le rince et le répète pour chaque projet que je veux construire.
Cependant quand j'ai les éléments suivants dans un fichier de commandes appelé build.bat
:
"%comspec%" /k "C:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" x86
echo "Starting Build for all Projects with proposed changes"
echo .
devenv "path\to\solutionFile\projectSolution2.sln" /build Debug
devenv "another\path\to\solutionFile\projectSolution3.sln" /build Debug
devenv "yet\another\path\to\solutionFile\projectSolution4.sln" /build Debug
echo "All builds completed."
pause
Le script de commandes n'exécute que la première ligne et attend jusqu'à ce que je tape exit
avant d'exécuter les autres. D'après ce que j'ai compris de la recherche que j'ai effectuée sur les fichiers de commandes et de toutes les questions de StackOverflow, cmd
appelle en réalité une autre instance d'elle-même qui exécute vcvarsall.bat
pour configurer l'environnement de construction.
Cela ne fonctionnera pas car taper exit
tue cette instance avec devenv
configuré et les commandes suivantes ne peuvent pas s'exécuter car devenv
n'est pas une commande reconnue (car le chemin exporté n'existera plus)
En bref , comment cela peut-il être réalisé (en transmettant le reste des commandes à l'instance cmd avec devenv
défini) dans un seul fichier de commandes? Je comprends que ce n’est pas un moyen robuste (et il existe de nombreux outils pour le faire) d’appeler des générations, mais j’espère avoir un seul script pour automatiser le travail manuel d’appel individuel de ces projets.
Comme l'a noté Jimmy, la solution trouvée, il faut supprimer la variable d'environnement %comspec%
car il s'agit d'un raccourci vers CMD.exe.
Cependant, la suppression de "%comspec" /k
entraîne l'ouverture d'une instance CMD, puis sa fermeture au bout d'une seconde. J'ai également précédemment essayé la fonction call
qui créait une instance CMD distincte lorsqu'elle était utilisée avec %comspec%
La solution consiste à ajouter call
devant la première ligne et supprimer %comspec
Voici le fichier batch final qui a fonctionné comme prévu.
@echo OFF
call "C:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" x86
echo "Starting Build for all Projects with proposed changes"
echo .
devenv "path\to\solutionFile\projectSolution2.sln" /build Debug
devenv "another\path\to\solutionFile\projectSolution3.sln" /build Debug
devenv "yet\another\path\to\solutionFile\projectSolution4.sln" /build Debug
echo .
echo "All builds completed."
pause
Notez que @echo OFF
indique au script de traitement par lots de ne pas renvoyer les commandes (telles que la commande call) dans le terminal (les erreurs et les avertissements seront toujours affichés).
Si cela est déjà dans un script batch, alors cette ligne:
"%comspec%" /k "C:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" x86
Devrait probablement juste être "C:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" x86
Pourquoi? %comspec%
est simplement un raccourci de variable d’environnement vers cmd.exe. Par conséquent, comme vous avez pu le constater, il lance une nouvelle instance de cmd avec l’option/k spécifiée (qui, si vous exécutez cmd /?
indique Carries out the command specified by string but remains
). Vous ne vous souciez pas de rester, vous ne voulez même pas un nouveau cmd.exe lorsque vous exécutez déjà votre fichier de commandes.