“编程”批处理文件,IF语句中的IF语句?

时间:2012-04-02 11:48:33

标签: if-statement batch-file command prompt

为什么这段代码不能正常工作?

对不起,我无法理解如何发布代码,所以这里是代码的图像:

![在此处输入图片说明] [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

为了大正义:此文字来自http://i.stack.imgur.com/RgsId.png

3 个答案:

答案 0 :(得分:3)

cmd可以处理嵌套的if就好了。你的问题与众不同。因为它是所有你的if支票,除了第一个不会做你想要的。

通过添加

来使用延迟扩展
setlocal enabledelayedexpansion

位于批处理文件的顶部,并使用!errorlevel!代替%errorlevel%

但是,由于您只检查Errorlevel是否为0,您也可以

if not errorlevel 1 ...

而不是

if %errorlevel%==0

答案 1 :(得分:2)

乔伊已经诊断出一个有关延迟扩张的问题。你有另一个 - 你不应该在IF ELSE块中放置标签 - 你很可能无法得到你想要的结果。请参阅https://stackoverflow.com/a/8481978/1012053

Christian有一个很好的建议来重构你的代码以摆脱嵌套。

由于您只是在增加睡眠间隔时执行相同的命令,因此可以使用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

答案 2 :(得分:1)

由于所有else子句都以goto结尾,为什么不将它们全部反转,那么您将消除嵌套。

如果代码有效,则完成工作。如果它仍然不起作用,那么这是一个较少考虑的因素。