2011-04-18 4 views
3

J'écris un fichier batch pour mettre à niveau certains systèmes. J'ai besoin d'analyser une date à partir d'un fichier XML et de l'enregistrer pour l'utiliser plus tard dans le fichier. Le format de la date est aaaa \ MM \ jj.Fichier de traitement par lots ErrorLevel woes

Ce que j'ai à ce jour est:

@echo off  
setLocal DisableDelayedExpansion  
for /f "tokens=* delims= " %%G in (ConnectionManagement.xml) do ( 
    set str=%%G  
    set mydate=%%G  
    echo got-  
    echo %%G  
    echo %mydate%  
    PAUSE 

    ECHO %mydate%|findstr /R /C:[0-9][0-9][0-9][0-9]\\[0-9][0-9]\\[0-9][0-9] > nul  
    IF ERRORLEVEL 0 goto valueok  
) 

echo DONE  
PAUSE 

goto end  

:valueok  
echo VALUEOK 

:end  
PAUSE 

Malheureusement, ce mal reconnu l'en-tête xml comme une date valide; mais je pense que cela est à faire avec ErrorLevel étant réinitialisé (?). mydate n'est pas défini et reconnaît la variable vide mydate comme une correspondance (!! ??). La sortie est:

got-  
<?xml version="1.0" encoding="utf-8"?>  
ECHO is off.  
Press any key to continue . . . 
VALUEOK  
Press any key to continue . . . 

...

Obtenir assez désespérée pour trouver une solution. merci ...

Répondre

10

ErrorLevel n'est pas réinitialisé. Qu'est-ce qui se passe réellement, c'est que IF ERRORLEVEL 0 ne se comporte pas comme prévu. Fondamentalement, le test n'est pas "Est-ce que errorlevel est égal à 0?", Son "Est-ce que errorlevel est supérieur ou égal à zéro?". Compte tenu de cela, il devrait être clair que IF ERRORLEVEL 0 sera toujours vrai (au moins, si vous attendez seulement des erreurs positives ...)

Par conséquent, vous devez utiliser IF NOT ERRORLEVEL 1 goto valueok à la place.

+0

Ok, cela a fonctionné. Merci. Maintenant, qu'en est-il de mydate n'étant pas réglé correctement. Est-ce que je fais quelque chose de mal ici? – kreid

+0

@Joey D'où mon commentaire «au moins, si vous attendez seulement des erreurs positives» ;-) –

+0

Ah, désolé; négligé celui-là :) – Joey

0

Comme écrit RB, IF ERRORLEVEL 0 ne se comporte pas comme vous vous y attendez. Le if errorlevel est un boîtier IF spécial.
Pour utiliser une normale IF-construire, vous pouvez utiliser

setlocal EnableDelayedExpansion 
... 
FOR-LOOP .. DO (
    if !ERRORLEVEL! EQU 0 goto valueok 
+0

Merci, je ne le savais pas. Savez-vous que mon "mydate" n'est pas réglé quand je le fais: set mydate = %% G ?? – kreid

Questions connexes