Sortie du lot avec " EXIT / B X` où X>=1 agit comme si la commande était terminée avec succès lors de l'utilisation d'opérateurs && ou / / entre les appels de lots

j'essaie d'enchaîner une série de .Fichiers bat en utilisant le EXIT /B X commande pour retourner le succès ou l'échec et && et || pour les conditionnelle de l'exécution de la prochaine .chauve-souris (par exemple,a.bat && b.bat).

peu importe si j'appelle EXIT /B 0 ou autre chose pour en finir avec A. bat,a.bat && b.bat appellera B. bat afterward. Ma compréhension est que EXIT /B 0 devrait mettre ERRORLEVEL=0, qui est le succès, donc le && devrait continuer. Le contrepoint à cela est que l'appel EXIT /B 1 devrait mettre ERRORLEVEL=1 qui est l'échec, de sorte que le && devrait s'arrêter. Ce qui me manque ici?

exemple banalisé:

Pour les non-commandes de traitement par lots, agissant comme prévu:

C:> echo test|findstr test>NUL && echo yes
yes

C:> echo test|findstr test>NUL || echo yes

C:> echo test|findstr nope>NUL && echo yes

C:> echo test|findstr nope>NUL || echo yes
yes

en utilisant EXIT /B voit toujours un.bat as successful:

C:> echo @EXIT /B 0 > a.bat

C:> a.bat && echo yes
yes

C:> a.bat || echo yes

C:> echo @EXIT /B 1 > a.bat

C:> a.bat && echo yes
yes

C:> a.bat || echo yes

Comment puis-je sortir d'un.bat so that a.bat && b.bat et a.bat || b.bat se comporter comme prévu?

toutes les commandes sont exécutées en cmd.exe on Windows XP SP3.

17
demandé sur Peter Mortensen 2011-01-08 10:24:34

4 réponses

si vous me demandez, les codes de sortie dans les fichiers batch sont cassés pour cette raison exacte, mais il y a une solution de contournement hacky que vous pouvez utiliser. Comme la dernière ligne de votre fichier de commandes, utilisez:

@%COMSPEC% /C exit 1 >nul

Puisqu'il s'agit d'un processus réel qui est lancé, vous obtenez un vrai code de sortie de processus et && et || fonctionnera.

13
répondu Anders 2011-01-08 22:16:27

ça marche comme il faut quand on utilise appel pour exécuter des scripts de traitement par lots contenant une instruction de sortie:

C:\>echo @EXIT /B 1 > a.bat

C:\>call a.bat && echo yes

C:\>call a.bat || echo yes
yes

En passant, il dit à tortMicrosoft docs:

Appel n'a aucun effet à l'invite de commande lorsqu'il est utilisé en dehors d'un script ou par lot fichier.

10
répondu marapet 2018-08-23 09:52:57

Si vous utilisez start /wait vous pouvez également l'utiliser dans une application Windows très simple (écrite en C#) appelée par les fichiers batch de DOS comme so:

static class Program
{
    [STAThread]
    static void Main(string[] args)
    {
        Environment.ExitCode = Convert.ToInt32(args[0]);
    }
}

alors l'application peut être appelée par votre fichier de lot DOS et évaluer le résultat. i.e.

c:> start /wait SetRC 1
c:> if "%errorlevel%"=="1" goto abort

REMARQUE:/wait n'est pas nécessaire dans un fichier de commandes.

vous pouvez passer dans le code de retour que vous voulez comme argument à votre programme.cs et le sortir de cette façon de la garantie.

0
répondu user2989311 2018-08-22 13:48:52

je pense que vous êtes obtenir Errorlevel=0 avec parce que vous exécutez effectivement un.bat (indépendamment du code de retour).

Vous ne réussirait pas le vérifier si a.bat n'existe pas. CALL est la seule façon que je sais à tirer dans l'environnement à partir de a.bat.

0
répondu TheDude 2018-08-22 15:59:52