2009-04-08 3 views
4

J'ai un fichier de commandes en cours d'exécution dans une étape de génération personnalisée Visual Studio pour copier des fichiers dans un répertoire d'installation. Je veux qu'il sorte correctement quand la copie échoue. Les problèmes avec les options que j'ai sont:Comment renvoyer une erreur de .bat dans le projet Visual Studio (2008 SP1)?

  • exit 1
    Cela fonctionne à l'intérieur de l'amende de séquence de construction, mais parfois je veux utiliser le fichier de commandes à partir de la ligne de commande ou à partir d'un autre lot, et dans ces cas, la exit provoque également la sortie de l'appelant.

  • exit /b 1
    Cela fonctionne bien à partir de la ligne de commande ou d'un autre fichier batch, mais Visual Studio ne reconnaît pas que le code de retour était pas 0 (il rapporte le projet ayant « 0 erreur (s) ») .

je suis tombé sur un lien qui me fournit une solution: http://www.nabble.com/Re:-bjam-and-Windows-p17457249.html

Essentiellement, il dit que je dois faire écho à un message d'erreur avant de faire le exit /b. Par exemple,

echo MyProj : error : could not copy files. 

Est-ce que quelqu'un sait exactement ce format de message déclenche Visual Studio pour reconnaître une erreur?

J'ai essayé de peaufiner cela et un peu de travail et d'autres ne le font pas. Il semble qu'il doit correspondre à quelque chose comme

.*\: .*error.*\: 

Est-ce documenté quelque part?

Merci.

Ceci est avec Visual Studio 2008 SP1 sur Windows XP Pro SP3 (dans le cas cmd.exe a un comportement différent entre les versions de Windows).

+0

@Owen, je ne connais pas la réponse, mais cela peut être utile si vous spécifiez la version de VS que vous utilisez. La réponse peut être différente selon la version exacte de VS. –

+0

Bon point. C'est VS 2008. – Owen

Répondre

2

En ce qui concerne votre question réelle,
This page spécifie la syntaxe complète attendue par VS en tant que sortie des outils de génération.

+0

Parfait. Je vous remercie! – Owen

1

Etes-vous que vous êtes tout à fait sûr de tester correctement? Je viens d'essayer ce fichier batch:

echo bla 
exit /b 1 

avec VS2008, comme une étape de pré-construction et obtenu ceci:

1>------ Build started: Project: XXXX, Configuration: Debug Win32 ------ 
1>Performing Pre-Build Event... 
1>bla 
1>Project : error PRJ0002 : Error result 1 returned from 'C:\Windows\system32\cmd.exe'. 
1>Build log was saved at "file://c:\XXXXX\BuildLog.htm" 
1>XXXXX - 1 error(s), 0 warning(s) 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 

J'ai aussi essayé avec une étape de génération personnalisée pour une fichier avec le même résultat exact.
Il convient de noter que je suis habitué VS2008- SP1 de sorte que peut être la différence.

+0

Intéressant. C'est actuellement une étape de construction personnalisée sur le fichier. Je l'ai essayé comme un événement de construction et obtenu le même résultat. J'ai même essayé de changer le script pour être exactement ce que vous avez. Mais oui, je suis sûr que ça ne marche pas de la même manière sur ma machine. Le simple fait de modifier la ligne "echo" change le résultat. – Owen

1

En général, la valeur de retour d'un fichier de commandes est la valeur de retour de la dernière commande exécutée à partir du fichier de commandes.

Quittez si fonctionne, mais si ce n'est pas le cas, pour quelque raison que ce soit, vous pouvez toujours utiliser un programme d'assistance pour définir votre valeur de retour.

Retour dans les jours DOS, vous pouvez utiliser ECHO en combinaison avec la commande CHOIX pour définir votre valeur de retour, mais hélas, il est ne fait plus partie des fenêtres.

Vous pouvez écrire un petit programme à la place.Quelque chose qui prend la valeur de retour souhaitée comme argument, puis définit et retourne que la valeur de retour:

#include <cstdio> 

int main(int argc, char * argv[]) { 

    if (argc == 2) { 

     return strtoul(argv[1], NULL, 10); 

    } else { 
     return 0; 
    } 
} 

Ensuite, dans votre fichier de commandes, vous appelez simplement le programme avec la valeur de retour souhaitée et sautez jusqu'à la fin .

+0

Intéressant! Cela fonctionne vraiment. Je me demande vraiment quel est le problème avec "exit/b" ... – Owen

2

Une autre chose que vous pouvez essayer est:

set errorlevel=1 
exit /b 

Cela a essentiellement le même effet que ce qui suggère @ Bill. La valeur de retour de la dernière exécution du programme est défini sur la variable d'environnement appelée %errorlevel% et puis quand vous cmd.exe quittez c'est la valeur retournée par le processus (qui est ce que VS lit)

+0

Même chose avec "exit/b 1": ça ne marche pas. Mais cela fonctionne si je fais "set errorlevel = 1" puis "exit". – Owen

+0

Ne fonctionne pas si j'omets le "exit" soit-i.e. si je fais "set errorlevel = 1" la dernière ligne du .bat. – Owen

0

Pour une raison quelconque, exit /b 12 ne définit pas le code de sortie lorsqu'il est écrit dans l'étape de post-construction. Le exit 12 régulier fonctionnerait.

Donc, pour revenir correctement le code de sortie de votre fichier de chauve-souris, vous devriez écrire ceci:

call yourbat.bat 
if %errorlevel% NEQ 0 exit %errorlevel% 

La commande call est important lors de l'exécution des fichiers de chauve-souris, il crée un nouveau contexte, le fichier bat en cours d'exécution en sorte que lorsque vous exécuter exit /b 1 dans le fichier bat, il quittera ce contexte, pas l'interpréteur de commande entière. Ensuite, vous pouvez comparer le niveau d'erreur et quitter avec cela.

Questions connexes