2009-10-01 4 views
0

J'ai un fichier séquentiel qui analyse un tas de noms de fichier dans un fichier texte et les concatène en un seul fort - il a déjà été discuté here. Cependant, je ne veux pas que la chaîne contienne un fichier si le fichier renvoie une erreur quand je l'exécute à travers une commande (comme une vérification VCS, par exemple). Voici ma tentative:Windows batch-file errorlevel question

set FILE_LIST= 
for /f %%x in (temp.txt) do (

:: perform a VCS test 
accurev diff -b %%x 

:: skip concatenation if error level is > 2 
IF errorlevel 2 GOTO NEXT 

:: perform the concatenation 
set FILE_LIST=!FILE_LIST! %%x 

:NEXT 
:: print a message if here due to an error above 
IF errorlevel 2 echo VCS problem with this file: %%x 
) 

Le problème est - le script semble arrêter l'exécution de l'ensemble de la boucle dès qu'il en trouve un errorlevel supérieur à 2. S'il y a cinq fichiers dans la liste et le troisième a un problème VCS - le script ne gère que les deux premiers.

+0

Il semble que le niveau d'erreur ne soit pas réinitialisé à chaque itération. Est-il possible de le réinitialiser manuellement à 0 à la fin de la boucle? –

+0

mmyers: il semblerait que le [conseil des internets] (http://batcheero.blogspot.com/2007/07/never-set-errorlevel.html) est de ne jamais définir manuellement la variable errorlevel. – dls

+0

ahh - Je vois le formatage de lien hypertexte ne fonctionne pas dans les commentaires. – dls

Répondre

0
setlocal ENABLEDELAYEDEXPANSION 
set FILE_LIST= 
for /f %%x in (temp.txt) do (
    accurev diff -b "%%~x" 
    IF errorlevel 2 (
     echo VCS problem with this file: %%~x 
    ) ELSE (
     set FILE_LIST=!FILE_LIST! %%x 
    ) 
) 
0

IF construction ERRORLEVEL a une caractéristique étrange ... il retourne TRUE si le code de retour était égal ou supérieur que le errorlevel spécifié.

Référence this link Pour savoir comment gérer cette "caractéristique".

+0

c'est ce que je suis après ici - pour cet exécutable (accurev) les seuls "bons" niveaux d'erreur sont 0 ou 1, donc tout ce qui est au dessus de 2 devrait être attrapé. Je suis confus quant à pourquoi il semble renflouer de la boucle for-quand il attrape une erreur. – dls