【问题标题】:"Programming" a Batch file, IF statements inside IF statements?“编程”一个批处理文件,IF语句中的IF语句?
【发布时间】:2012-04-02 11:48:32
【问题描述】:

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

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

![在此处输入图片描述][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 进行 OCR 编辑

【问题讨论】:

  • 请格式化您的代码以使其可读。
  • 这是一棵漂亮的圣诞树;)
  • 除非您直接在 Paint 中编写代码请以文本形式发布代码
  • 愚人节是昨天...
  • 我把你的圣诞树扔到了free-ocr.com。哇!

标签: if-statement batch-file command prompt


【解决方案1】:

cmd 可以很好地处理嵌套的ifs。你的问题是另一个问题。目前所有你的if检查,除了第一个不会做你想做的事。

通过放置一个

来使用延迟扩展
setlocal enabledelayedexpansion

在批处理文件的顶部并使用!errorlevel! 而不是%errorlevel%

但是,由于您只检查 Errorlevel 是否为 0,因此您也可以这样做

if not errorlevel 1 ...

而不是

if %errorlevel%==0

【讨论】:

  • 我只剩下一个问题:当一切都完成后,当执行 uTorrent 时,脚本应该停止,对吗?但它还在继续!
  • 好的,我在“start uTorrent.exe”行之后添加了“GOTO END”,并将 :END 放在批处理文件的末尾。现在一切都(可能)正常工作!谢谢!
【解决方案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

【讨论】:

  • 看来这个解决方案并不能正常工作,但是 5 星因为它最终会退出程序,5 星表示努力!我以后肯定会需要这个!
【解决方案3】:

既然所有的else 子句都以goto 结尾,为什么不把它们全部颠倒过来,这样你就可以消除嵌套了。

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

【讨论】:

  • 确实应该也可以。问题不在于它们的嵌套,而是它们不知道如果您在块中使用环境变量会发生什么。我不得不承认,我实际上并没有尝试了解他们在那里做了什么......
猜你喜欢
  • 1970-01-01
  • 2017-08-01
  • 2021-06-23
  • 2021-06-10
  • 2022-01-11
  • 1970-01-01
  • 2021-06-14
  • 1970-01-01
  • 2014-06-16
相关资源
最近更新 更多