web-dev-qa-db-fra.com

SI EXISTE C:\directory\goto a else goto b problem windows XP fichiers batch

chaque fois que j’exécute la code ci-dessous, j’ai commis une erreur en utilisant les lignes if exist, car peu importe si le répertoire existe ou non, il agit comme si la ligne n’était jamais là ... autre ligne.


echo off  
echo  
echo (c) Ryan Leach 2010  
echo Stockmaster Backup System for exclusive use of Riverland Paper Supplies  
echo  
echo Please ensure that all computers are out of stock master to the windows xp screen  
echo and that the backup usb with the day of the week labeled on it is inserted  

pause  

IF EXIST D:\RPS_BACKUP\backups_to_Zip\ goto zipexist else goto zipexistcontinue  
:zipexist  
IF EXIST d:\RPS_BACKUP\backups_old\ rd /s /q D:\RPS_BACKUP\backups_old  
echo backup did not complete last time, backup will restart from Zip-usb phase.  
pause  
call Zip  
goto tidyup  
:zipexistcontinue  

IF EXIST D:\RPS_BACKUP\backups_old\ goto oldexists else oldexistscontinue  
:oldexists  
IF EXIST d:\RPS_BACKUP\backup_temp\ rename D:\RPS_BACKUP\backups_temp backups_to_Zip  
rd /s /q D:\RPS_BACKUP\backups_old  
echo backup did not complete last time, backup will restart at the Zip to usb phase.  
pause  
call Zip  
goto tidyup  
:oldexistscontinue  

IF EXIST D:\RPS_BACKUP\backups_temp\ goto tempexists else goto tempexistscontinue  
:tempexists  
IF EXIST D:\RPS_BACKUP\backups_old\ goto backupfailed else goto tempexistscontinue  
:backupfailed  
@rd /s /q D:\RPS_BACKUP\backups_temp  
echo backup did not complete last time, backup will restart from start.  
pause  
:tempexistscontinue  

md D:\RPS_BACKUPS\backups_temp  
xcopy \\user1\c\* D:\RPS_BACKUP\backups_temp\user1\c /h /e /z /f /r /i /s /k  
IF NOT ERRORLEVEL == 1 GOTO ErrorHandler  
xcopy C:\* D:\RPS_BACKUP\backups_temp\user2\c /h /e /f /r /i /s /k  
IF NOT ERRORLEVEL == 1 GOTO ErrorHandler  
xcopy \\user3\c\* D:\RPS_BACKUP\backups_temp\user3\c /h /e /z /f /r /i /s /k  
IF NOT ERRORLEVEL == 1 GOTO ErrorHandler  
call sub  
call Zip  
:tidyup  
rename D:\RPS_BACKUP\backups_to_Zip backups  
pause  
goto :eof  

:ErrorHandler  
echo xcopyerrorcode is ERRORLEVEL contact ryan  
pause  
7
Ryan The Leach

Utilisez des parenthèses pour regrouper les branches individuelles:

IF EXIST D:\RPS_BACKUP\backups_to_Zip\ (goto zipexist) else goto zipexistcontinue

Dans votre cas, l'analyseur ne verra jamais la else appartenant à la if car goto acceptera avec joie tout jusqu'à la fin de la commande. Vous pouvez voir un problème similaire lorsque vous utilisez echo au lieu de goto.

De plus, l'utilisation de parenthèses vous permettra d'utiliser directement les instructions sans avoir à vous déplacer (bien que je ne sois pas capable de réécrire votre code pour utiliser des techniques de programmation structurées; il est peut-être trop tôt ou cela ne se prête pas bien au blocage de structures le code est en ce moment).

16
Joey

Si vous souhaitez exclure tout problème avec la partie else, essayez de supprimer la else et placez la commande sur une nouvelle ligne. Comme ça:

IF EXIST D:\RPS_BACKUP\backups_temp\ goto tempexists
goto tempexistscontinue  
5
Prutswonder

Dans l'aide (if /?):

 La clause ELSE doit figurer sur la même ligne que la commande après le IF. Par exemple:

 SI EXISTE nom de fichier. (
 del nom du fichier 
) SINON (
 echo nom du fichier. missing .
) 

 Ce qui suit ne fonctionnerait PAS car la commande del devait être terminée 
par une nouvelle ligne : 

 SI EXISTE nom de fichier. del nom de fichier. ELSE echo nomfichier. manquant 

 Les éléments suivants ne fonctionneraient pas non plus, puisque la commande ELSE doit figurer sur la même ligne
à la fin de la commande IF: 

 SI EXISTE nom de fichier. del nom de fichier .
 ELSE echo nomfichier. manquant
4
Gabe

Il y a un ELSE dans le langage de traitement par lots DOS? À l'époque où je faisais plus de ce genre de chose, il n'y en avait pas.

Si ma théorie est correcte et que votre AUTRE est ignoré, vous feriez mieux de le faire.

IF NOT EXIST file GOTO label

... qui vous fera également économiser une ligne de code (celle juste après votre IF).

Deuxièmement, je me souviens vaguement d’une sorte de bogue lors de la vérification de l’existence de répertoires. La vie serait plus facile si vous pouviez tester l'existence d'un fichier dans ce répertoire. S'il n'y a pas de fichier dont vous pouvez être sûr, essayez quelque chose (cela fonctionnait jusqu'à Win95, IIRC) serait d'ajouter le nom du fichier de périphérique NUL à votre nom de répertoire, par exemple.

IF NOT EXIST C:\dir\NUL GOTO ...
2
Carl Smotricz
@echo off

:START
rmdir temporary
cls
IF EXIST "temporary\." (echo The temporary directory exists) else echo The temporary directory doesn't exist
echo.
dir temporary /A:D
pause

echo.
echo.
echo Note the directory is not found
echo.
echo Press any key to make a temporary directory, cls, and test again
pause

Mkdir temporary
cls
IF EXIST "temporary\." (echo The temporary directory exists) else echo The temporary directory doesn't exist
echo.
dir temporary /A:D
pause
echo.
echo press any key to goto START and remove temporary directory 
pause 

goto START
1
Edoctoor

Pour vérifier les répertoires, vous ne devez pas utiliser quelque chose comme:

if exist c:\windows\

Pour fonctionner correctement, utilisez:

if exist c:\windows\\.

noter la "." à la fin.

0
Mike Emery