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
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).
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
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
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 ...
@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
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.