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.
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.
ç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.
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.
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
.