"Программирование" командного файла, IF-операторов внутри IF-операторов? - PullRequest
0 голосов
/ 02 апреля 2012

Почему этот код не будет работать правильно?

Извините, я не мог понять, как разместить код, поэтому вот изображение кода:

! [Enterописание изображения здесь] [1] (также, пожалуйста, нажмите на ссылку, потому что я новый пользователь и пока не могу публиковать изображения)

Способна ли командная строка даже правильно выполнять эти «разветвленные команды IF»?Если так, что я делаю не так?Кто-нибудь знает?Пожалуйста, ответьте!

:STARTEXITING
"D:\dbStatusChecker\dbFi1estatus.exe" "D:\Dropbox" > dbstatus_uTorrent_Exit_Pass_1.txt
findstr /m "up to date" dbstatus_uTorrent_Exit_Pass_1.txt
if %error1eve1%==0 (
    SLEEP 2
    "D:\dbStatusChecker\dbFi1estatus.exe" "D:\Dropbox" > dbstatus_uTorrent_Exit_Pass_2.txt
    findstr /m "up to date" dbstatus_uTorrent_Exit_Pass_2.txt
    if %error1eve1%==0 (
        SLEEP 3
        "D:\dbStatusChecker\dbFi1estatus.exe" "D:\Dropbox" > dbstatus_uTorrent_Exit_Pass_3.txt
        findstr /m "up to date" dbstatus_uTorrent_Exit_Pass_3.txt
        if %error1eve1%==0 (
            process -q uTorrent.exe 15
            :STARTSTARTING
            "D:\dbStatusChecker\dbFi1estatus.exe" "D:\Dropbox" > dbstatus_uTorrent_Start_Pass_1.txt
            findstr /m "up to date" dbstatus_uTorrent_Start_Pass_1.txt
            if %error1eve1%==0 (
                SLEEP 2
                "D:\dbStatusChecker\dbFi1estatus.exe" "D:\Dropbox" > dbstatus_uTorrent_Start_Pass_2.txt
                findstr /m "up to date" dbstatus_uTorrent_Start_Pass_2.txt
                if %error1eve1%==0 (
                    SLEEP 3
                    "D:\dbStatusChecker\dbFi1estatus.exe" "D:\Dropbox" > dbstatus_uTorrent_Start_Pass_3.txt
                    findstr /m "up to date" dbstatus_uTorrent_Start_Pass_3.txt
                    if %error1eve1%==0 (
                        D:
                        cd\
                        cd Dropbox
                        cd uTorrent
                        start uTorrent.exe
                        ) else (
                        SLEEP 1
                        GOTO STARTSTARTING
                        ) else (
                    SLEEP 1
                    GOTO STARTSTARTING
                    ) else (
                SLEEP 1
                GOTO STARTSTARTING
                ) else (
            SLEEP 1
            GOTO STARTEXITING
            ) else (
        SLEEP 1
        GOTO STARTEXITING
        ) else (
    SLEEP 1
    GOTO STARTEXITING

Для большой справедливости: Этот текст был OCR-ed от http://i.stack.imgur.com/RgsId.png

Ответы [ 3 ]

3 голосов
/ 02 апреля 2012

cmd отлично справляется с вложенными if с. Ваша проблема другая. все ваши if чеки, кроме первого, не будут делать то, что вы хотите.

Используйте отложенное расширение, поставив

setlocal enabledelayedexpansion

вверху командного файла и используйте !errorlevel! вместо %errorlevel%.

Тем не менее, поскольку вы проверяете, что Errorlevel равно 0, вы также можете сделать

if not errorlevel 1 ...

вместо

if %errorlevel%==0
2 голосов
/ 02 апреля 2012

Джои диагностировал одну проблему, связанную с задержкой расширения.У вас есть другой - вы не должны помещать метку в блок IF ELSE - вы, скорее всего, не получите желаемого результата.См. https://stackoverflow.com/a/8481978/1012053.

У Кристиана есть отличное предложение реструктурировать ваш код, чтобы избавиться от вложенности.

Поскольку вы просто выполняете те же команды с увеличением интервалов ожидания, вы можете использовать FOR/ L цикл для дальнейшего упрощения вашего кода.

@echo off

:startExiting
set started=
for /l %%N in (1 1 3) do (
  if defined started sleep %%N
  set started=1
  "D:\dbStatusChecker\dbFileStatus.exe" "D:\Dropbox" > dbstatus_uTorrent_Exit_Pass_%%N.txt
  findstr /m "up to date" dbstatus_uTorrent_Exit_Pass_%%N.txt || goto :startExiting
)

process -q uTorrent.exe 15

:startStarting
set started=
for /l %%N in (1 1 3) do (
  if defined started sleep %%N
  set started=1
  "D:\dbStatusChecker\dbFileStatus.exe" "D:\Dropbox" > dbstatus_uTorrent_Start_Pass_%%N.txt
  findstr /m "up to date" dbstatus_uTorrent_Start_Pass_%%N.txt || goto :startStarting
)

d:
cd \Dropbox\uTorrent
start uTorrent.exe
1 голос
/ 02 апреля 2012

Поскольку все предложения else оканчиваются на goto, почему бы не перевернуть их все, тогда вы исключите вложение.

Если код работает, работа выполнена. Если это все еще не работает, ну, это еще один фактор для размышления.

...