【问题标题】:only do if day... batch file只做如果天...批处理文件
【发布时间】:2009-06-01 17:38:25
【问题描述】:

你好,我有一个批处理文件,如下所示:

if %day%==monday, tuesday, wednesday, thursday, friday (
goto yes
) else (
goto no
)

现在我知道第一行行不通。

我真正想要发生的事情:

它会自动检查现在是哪一天。如果是周一到周五,就必须去'yes',否则(周六/周日)就去'no'。

如何做到这一点?

【问题讨论】:

    标签: batch-file goto


    【解决方案1】:

    这是一个示例 bat 文件,我相信您可以想到其他方法来使用此示例代码。例如,任何时候您都需要一个“in”列表。棘手的一点是 %date:~0,3% 这表示扩展 %date% 环境变量并从位置 0 开始字符串的开头返回接下来的 3 个字符。您可以从“set /?”中了解更多信息。命令。

    示例:IsWeekDay.bat

    @echo off
    setlocal
    
    for %%i in (Mon,Tue,Wed,Thu,Fri) do (
        if "%date:~0,3%"=="%%i" goto YES
    )
    
    :NO
    echo No
    goto EOF
    
    :YES
    echo Yes
    
    :EOF
    endlocal
    

    【讨论】:

    • +1 非常好。它适用于我的Window7。 @YourComputerHelpZ 你能不能从命令行 %date% 和 date /t。你能告诉我们你得到了什么吗?
    【解决方案2】:

    我在网上遇到过这个。经过测试,它可以工作。以整数形式返回日期,您仍然可以使用它。

    @For /F "tokens=2,3,4 delims=/ " %%A in ('Date /t') do @( 
        Set Month=%%A
        Set Day=%%B
        Set Year=%%C
    )
    
    @echo DAY = %Day%
    @echo Month = %Month%
    @echo Year = %Year%
    

    【讨论】:

    • 请注意,这不适用于日期分隔符不是 / 的语言环境
    • 这不是一个可靠的解决方案,因为当我在这里使用 'date /t' 时,我得到的只是简短的 (YYYY-MM-DD),因此没有日期名称。与语言环境一起使用。如果这是用于出口(不是你的任何人),我不会打赌这会按预期工作。
    【解决方案3】:

    正如Jay 所提到的,使用date /t 仅适用于该命令输出星期几和日期的语言环境,而不适用于其他语言环境(例如俄语)。如果您不介意将批处理文件与一些 VBScript 混合使用,这里有一个适用于所有语言环境的解决方案。

    诀窍是这个微小的 VBScript 脚本,它将星期几输出为数字(1 = 星期日,2 = 星期一,... 7 = 星期六):

    WScript.Echo DatePart("w", Date)
    

    您可以从批处理文件运行此脚本,读取其输出并应用您的逻辑:

    for /f %%d in ('cscript dayofweek.vbs //nologo') do (
      if %%d==7 goto no   :: Saturday
      if %%d==1 goto no   :: Sunday
    )
    goto yes
    

    【讨论】:

      【解决方案4】:
      IF %day% == monday GOTO YES
      IF %day% == tuesday GOTO YES
      IF %day% == wednesday GOTO YES
      IF %day% == thursday GOTO YES
      IF %day% == friday GOTO YES
      GOTO NO
      

      【讨论】:

      • 真的是自己做,还是让用户自己输入?
      • 我认为 %day% 已经设置好了,而他并不完全理解分支。
      【解决方案5】:

      我没有按要求回答问题的批处理 fu,但是,假设这是一个 Windows 批处理文件,请考虑使用任务调度程序执行脚本,这将让您设置您所询问的调度类型为。

      【讨论】:

      • 我理解你,但是我也必须给出一个具体的时间。 BATCH 文件将在启动时运行。
      • 您可以在任务计划程序中设置一个触发器来执行“启动时”或“登录时”。不必有特定的时间。
      【解决方案6】:

      这是一个批处理文件,它以几乎与语言环境无关的方式提取星期几、星期几、月份和年份。

      唯一特定于区域设置的是星期几的拼写,其余的与区域设置无关。

      所以在英语中,它会在星期四返回 Thu,但在荷兰语中,它将是 do(用于 donderdag)。

      :: http://stackoverflow.com/questions/203090/how-to-get-current-datetime-on-windows-command-line-in-a-suitable-format-for-usi
      :: Works on any NT/2k machine independent of regional date settings
      ::
      :: 20110103 - adapted by jeroen@pluimers.com for Dutch locale
      :: 20110303 - adapted by jeroen@pluimers.com for day-of-week
      :: Dutch will get jj as year from echo:^|date, so the '%%c' trick does not work as it will fill 'jj', but we want 'yy'
      :: luckily, all countries seem to have year at the end: http://en.wikipedia.org/wiki/Calendar_date
      ::            set '%%c'=%%k
      ::            set 'yy'=%%k
      ::
      :: Also, in Dutch, there is a difference between %date% and date/t: the former will not include
      :: the day-of-the-week, but the latter will.
      :: That means the if "%date%A" LSS "A" trick does not work with %date%, we need a loop
      :: to check if the day-of-the-week needs us to take tokens 2-4 in stead of 1-3:
      ::      if "%date%A" LSS "A" (set toks=1-3) else (set toks=2-4)
      ::      for /f "tokens=1" %%t in ('date/t') do (...)
      ::
      :: Another difference between Dutch and English is that the Dutch date/t will prepend the day of the week in a lower case 2-letter form.
      :: So the LSS "A" trick needs to be replaced with an LSS "a" trick
      ::      if "%date%A" LSS "A" (set toks=1-3) else (set toks=2-4)
      ::        if "%%ta" LSS "a" (set toks=1-3) else (set toks=2-4)
      ::
      :: In addition, date will display the current date before the input prompt using dashes
      :: in Dutch, but using slashes in English, so there will be two occurances of the outer loop in Dutch
      :: and one occurence in English.
      :: This skips the first iteration:
      ::        if "%%a" GEQ "A"
      ::
      :: echo:^|date
      :: Huidige datum: ma 03-01-2011
      :: Voer de nieuwe datum in: (dd-mm-jj)
      :: The current date is: Mon 01/03/2011
      :: Enter the new date: (mm-dd-yy)
      ::
      :: date/t
      :: ma 03-01-2011
      :: Mon 01/03/2011
      ::
      :: The assumption in this batch-file is that echo:^|date will return the date format
      :: using either mm and dd or dd and mm in the first two valid tokens on the second line, and the year as the last token.
      ::
      :: The outer loop will get the right tokens, the inner loop assigns the variables depending on the tokens.
      :: That will resolve the order of the tokens.
      ::
      @ECHO off
          set v_day_of_week=
          set v_day=
          set v_month=
          set v_year=
      
          SETLOCAL ENABLEEXTENSIONS
            for /f "tokens=1" %%t in ('date/t') do (
              set v_day_of_week=%%t
              if "%%ta" LSS "a" (set toks=1-3) else (set toks=2-4)
            )
      ::DEBUG echo toks=%toks%
            for /f "tokens=2-4 delims=(-)" %%a in ('echo:^|date') do (
      ::DEBUG echo first token=%%a
              if "%%a" GEQ "A" (
                for /f "tokens=%toks% delims=.-/ " %%i in ('date/t') do (
                  set '%%a'=%%i
                  set '%%b'=%%j
                  set 'yy'=%%k
                )
              )
            )
            if %'yy'% LSS 100 set 'yy'=20%'yy'%
            set Today=%'yy'%-%'mm'%-%'dd'%
      
          ENDLOCAL & SET day_of_week=%v_day_of_week% & SET v_year=%'yy'%& SET v_month=%'mm'%& SET v_day=%'dd'%
      
          ECHO Today is Year: [%V_Year%] Month: [%V_Month%] Day: [%V_Day%]
          set datestring=%V_Year%%V_Month%%V_Day%
          echo %datestring%
          echo day of week=%day_of_week%
      
          :EOF
      

      玩得开心!

      --杰罗恩

      【讨论】:

        【解决方案7】:

        来自this answer,我们有

        wmic path win32_localtime get dayofweek
        

        根据this thread 中的建议对此进行扩展,我们可以如下设置 dayofweek 变量:

        @echo off
        REM Unset dayofweek in case set in a previous execution of this batch file
        set dayofweek=
        REM Get dayofweek into a variable.  Locale-specific:  0 is either Sunday or Monday.
        for /F "skip=1 tokens=*" %%a in ('wmic path win32_localtime get dayofweek') do if not defined dayofweek set dayofweek=%%a
        echo %dayofweek%
        

        请注意,0 可以是星期日或星期一,具体取决于您的语言环境。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-02-13
          • 2012-01-16
          • 2022-07-23
          • 1970-01-01
          • 2013-02-25
          相关资源
          最近更新 更多