каждый раз, когда я работаю code
ниже его происходит со мной, я сделал ошибку с помощью, если существуют строки, как неважно, существует ли каталог или нет, это действует, как будто строка еще никогда не была там... или этим или не чтение строка.
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
Используйте круглые скобки для группировки отдельных ветвей:
IF EXIST D:\RPS_BACKUP\backups_to_zip\ (goto zipexist) else goto zipexistcontinue
В вашем случае синтаксический анализатор никогда не увидит else
, принадлежащий if
, потому что goto
с радостью примет все до конца команды. Вы можете увидеть аналогичную проблему при использовании echo
вместо goto
.
Также использование круглых скобок позволит вам использовать операторы напрямую, без необходимости прыгать вокруг (хотя я не смог переписать ваш код, чтобы фактически использовать методы структурированного программирования; возможно, это слишком рано или это не подходит для блочные структуры, как сейчас код).
Из справки ( if /?
):
The ELSE clause must occur on the same line as the command after the IF. For example: IF EXIST filename. ( del filename. ) ELSE ( echo filename. missing. ) The following would NOT work because the del command needs to be terminated by a newline: IF EXIST filename. del filename. ELSE echo filename. missing Nor would the following work, since the ELSE command must be on the same line as the end of the IF command: IF EXIST filename. del filename. ELSE echo filename. missing
Если вы хотите исключить какие-либо проблемы с частью else
, попробуйте удалить else
и поместить команду в новую строку. Как это:
IF EXIST D:\RPS_BACKUP\backups_temp\ goto tempexists
goto tempexistscontinue
Есть ЕЩЕЕ на языке пакетной обработки DOS? В те дни, когда я больше занимался подобными вещами, этого не было.
Если моя теория верна и ваш ELSE игнорируется, вам может быть лучше выполнить
IF NOT EXIST file GOTO label
... что также сэкономит вам строку кода (ту, которая находится сразу после вашего IF).
Во-вторых, я смутно помню какую-то ошибку с проверкой существования каталогов. Жизнь была бы проще, если бы вы могли проверить наличие файла в этом каталоге. Если нет файла, в котором вы можете быть уверены, попробуйте (это работало до Win95, IIRC) было бы добавить имя файла устройства NUL
к имени вашего каталога, например
IF NOT EXIST C:\dir\NUL GOTO ...