如何批量生成连续的if - else语句?

时间:2017-02-14 19:00:40

标签: batch-file if-statement continuous timetable

是否有一种更简单,更合乎逻辑的方法来批量制作连续的if - else语句,而不是我现在使用的语句。我对编程等很陌生,首先我尝试制作这样的代码:

if %time:~0,2% geq 8 (
  if %time:~0,2% leq 9 (
    start "" "C:\users\me\desktop\subject1.bat"
  ) else (
  if %time:~0,2% leq 10 (
    start "" "C:\users\me\desktop\subject2.bat"
  ) else (
    if %time:~0,2% leq 11 (
        start "" "C:\users\me\desktop\subject3.bat"
  )
) else (
Exit
)

现在的想法是,如果时间不超过8,它就会关闭程序。但是如果它超过8那么它就会检查时间是否小于9 - >开放主题1,小于10 - > subject2等但是代码在第二个 else 上没有用,所以我开始使用它主要是因为它有效:

if %time:~0,2% geq 8 (
goto :check1
) else (
  Exit
)
:check1 (
  if %time:~0,2% leq 9 (
    start "" "C:\users\me\desktop\subject1.bat"
  ) else (
    goto :check2
  )
)
:check2 (
  if %time:~0,2% leq 10 (
    start "" "C:\users\me\desktop\subject2.bat"
  ) else (
    goto :check3
  )
)
:check3 (
  if %time:~0,2% leq 11 (
    start "" "C:\users\me\desktop\subject3.bat"
  )
)

第二种方式有效,但看起来很糟糕,即使对我也难以阅读。有更简单的方法吗? 我制作这个代码的原因是因为我的笔记本电脑启动速度慢(SSHD混合驱动器而不是SSD)所以我通过自动运行启动(完成)和连接到wifi(也完成)来补偿丢失的时间并打开所需的软件和网站。

2 个答案:

答案 0 :(得分:2)

您的第一个变体:嵌套if / else

您的代码中缺少两个右括号(7×(,5×))。

这是你的代码有一点不同的缩进:

if %time:~0,2% geq 8 (
    if %time:~0,2% leq 9 (
        start "" "C:\users\me\desktop\subject1.bat"
    ) else (
        if %time:~0,2% leq 10 (
            start "" "C:\users\me\desktop\subject2.bat"
        ) else (
            if %time:~0,2% leq 11 (
                start "" "C:\users\me\desktop\subject3.bat"
            )
        ) else (
            exit
        )

你想要完成的是:

if %time:~0,2% geq 8 (
    if %time:~0,2% leq 9 (
        start "" "C:\users\me\desktop\subject1.bat"
    ) else (
        if %time:~0,2% leq 10 (
            start "" "C:\users\me\desktop\subject2.bat"
        ) else (
            if %time:~0,2% leq 11 (
                start "" "C:\users\me\desktop\subject3.bat"
            )
        )
    )
) else (
    exit
)

您也可以这样写:

if %time:~0,2% geq 8 (
    if %time:~0,2% leq 9 (
        start "" "C:\users\me\desktop\subject1.bat"
    ) else if %time:~0,2% leq 10 (
        start "" "C:\users\me\desktop\subject2.bat"
    ) else if %time:~0,2% leq 11 (
        start "" "C:\users\me\desktop\subject3.bat"
    )
) else (
    exit
)

您的第二个变体:平面if / else

另外,您的替代变体可能更简单;此外,标签不应该跟(

if not %time:~0,2% geq 8 (
    exit
)
if %time:~0,2% leq 9 (
    start "" "C:\users\me\desktop\subject1.bat"
    goto :cont
)
if %time:~0,2% leq 10 (
    start "" "C:\users\me\desktop\subject2.bat"
    goto :cont
)
if %time:~0,2% leq 11 (
    start "" "C:\users\me\desktop\subject3.bat"
    goto :cont
)
:cont

其他问题

  1. 考虑使用exit /B而不是exit,因为前者只是批处理批处理文件,而后者终止了基础命令提示符实例。
  2. start(没有/WAIT选项)不等到运行批处理文件完成;考虑改为使用call命令。
  3. %time%变量可能包含填充零,例如08:30,因此%time:~0,2%扩展为08而不是 SPACE 8;带前导零的数字被视为八进制数,因此比较可能会失败;为了避免此类问题,您可以在if / else阻止之前执行以下操作,并为其使用变量%hour%而不是%time:~0,2%

    set "hour=%time:~0,2%" & rem // (extract hour)
    set "hour=1%hour: =0%" & rem // (prepend `1`, replace leading <kbd>SPACE</kbd> by `0`)
    set /A "hour%%=100"    & rem // (remove leading `1`, avoid leading `0` finally)
    
    echo Hour value to be used further: %hour%
    

答案 1 :(得分:0)

下面的批处理代码回答了您的问题:“有更简单的方法吗?”

@echo off
setlocal EnableDelayedExpansion

rem Define the "subject" array with batch files for each hour
set "subject[9]=subject1.bat"
set "subject[10]=subject2.bat"
set "subject[11]=subject3.bat"

rem Get the array element corresponding to current hour
set /A hour=1%time:~0,2%-100
set "file=!subject[%hour%]!"

if defined file start "" "C:\users\me\desktop\%file%"

有关此解决方案的进一步说明,您必须了解数组是什么,因此建议您先阅读this introduction,然后阅读Wikipedia article,最后阅读{{3批处理文件中的数组管理。