zoukankan      html  css  js  c++  java
  • Windows批处理:获取时间变量

    1、获得系统当前时间

    1.  
      ::获得日期 %date:~0,4%表示获得date的第0个起的四个字符
    2.  
      echo %data%
    3.  
      set CURRENT_DATE=%date:~0,4%-%date:~5,2%-%date:~8,2%
    4.  
      echo %CURRENT_DATE%
    5.  
      ::获得星期
    6.  
      set week=%date:~11%
    7.  
      echo %week%
    8.  
      ::获得时间
    9.  
      set CURRENT_TIME=%time:~0,2%:%time:~3,2%:%time:~6,2%
    10.  
      set hour=%time:~0,2%
    11.  
      set minute=%time:~3,2%
    12.  
      echo %CURRENT_TIME%

    2、if 判断

    note:注意bat文件编码与window系统的编码一致性

    1.  
      if %week%==周日 (
    2.  
      echo 今天周末
    3.  
      )

    3、变量的定义,和修改,有的博客资料中说要加SETLOCAL ENABLEDELAYEDEXPANSION ,这样在执行时候会重新加载环境变量。但我在win10上测试不加也可以。但出现了一个特别的存在,见后面的demo,修改后第一次还是原来数据,第二次进入循环才正确读取。

    1.  
      @echo off
    2.  
      set isSingle_am=0
    3.  
      echo %isSingle_am%
    4.  
      set isSingle_am=1
    5.  
      echo %isSingle_am%
    6.  
      pause

    执行如图:

    4 、随机数

    下例:随机出[1,10]的随机数

    1.  
      set num=%random%
    2.  
      set /a num=num%%10+1
    3.  
      echo %num%

    5、定时操作

    调用下面代码:延时2秒

    choice /t 2 /d y /n >nul

    6、无线循环操作,for循环我没仔细研究,

    这里用到的模式如下:

    1.  
      :start
    2.  
       
    3.  
      ....
    4.  
       
    5.  
      go start

    下面是我写的一个打卡 demo,但不清楚为何 变量修改后,反应不及时,仍然打印的是原来数字,第二次循环打印的才是修改后的:

    1.  
      @echo off
    2.  
      SETLOCAL ENABLEDELAYEDEXPANSION
    3.  
      set isSingle_am=0
    4.  
      set isSingle_pm=0
    5.  
      set num=%random%
    6.  
      set /a num=num%%10+1
    7.  
      echo %num%
    8.  
      :start
    9.  
       
    10.  
       
    11.  
      ::获得日期
    12.  
      ::set CURRENT_DATE=%date:~0,4%-%date:~5,2%-%date:~8,2%
    13.  
      ::echo %CURRENT_DATE%
    14.  
      ::获得星期
    15.  
      ::set week=%date:~11%
    16.  
      ::echo %week%
    17.  
      ::获得时间
    18.  
      ::set CURRENT_TIME=%time:~0,2%:%time:~3,2%:%time:~6,2%
    19.  
      ::set hour=%time:~0,2%
    20.  
      ::set minute=%time:~3,2%
    21.  
       
    22.  
      ::echo %CURRENT_TIME%
    23.  
       
    24.  
       
    25.  
       
    26.  
      if %date:~11%==周日 (
    27.  
      echo 今天周末
    28.  
      )
    29.  
      if %date:~11%==周六 (
    30.  
      echo 今天周末
    31.  
      ) else (
    32.  
       
    33.  
      echo 今天工作日
    34.  
       
    35.  
      if %time:~0,2%==8 (
    36.  
       
    37.  
      if %time:~3,2% GTR 45+num (
    38.  
       
    39.  
      if %isSingle_am%==0 (
    40.  
      echo 打早卡
    41.  
      choice /t 1 /d y /n >nul
    42.  
      set isSingle_am=1
    43.  
      echo 打早卡%num%
    44.  
      choice /t 2 /d y /n >nul
    45.  
      ) else (
    46.  
      echo 已经打过早卡
    47.  
      )
    48.  
      )
    49.  
      )
    50.  
       
    51.  
      if %time:~0,2%==16 (
    52.  
      if %time:~3,2% GTR 0+num (
    53.  
      echo 打晚卡
    54.  
      if %isSingle_pm%==0 (
    55.  
       
    56.  
      choice /t 1 /d y /n >nul
    57.  
      set isSingle_pm=1
    58.  
      echo 打晚卡%isSingle_pm%
    59.  
      choice /t 2 /d y /n >nul
    60.  
      ) else (
    61.  
      echo 已经打过晚卡
    62.  
      )
    63.  
       
    64.  
      )
    65.  
      )
    66.  
       
    67.  
      )
    68.  
       
    69.  
      choice /t 20 /d y /n >nul
    70.  
       
    71.  
      goto start
    72.  
       
    73.  
       
    74.  
      pause

    执行结果如下:

    当前时间是16点,执行的打晚卡,执行了

    1.  
      set isSingle_pm=1        
    2.  
      echo 打晚卡%isSingle_pm%  

    后打印的仍然 isSingle_pm为0.但第二次进入循环的时候判断if %isSingle_pm%==0 没有通过,就是说第二次读取的时候set isSingle_pm=1(现在小弟仍然不清楚为什么,SETLOCAL ENABLEDELAYEDEXPANSION 加不加结果一样,望熟悉的人bat 语言的大神指正下)。

    批处理语法整理:

    1、echo 和 @

     @ 隐藏他后面的这一行的命令本身(只能影响当前行)

    echo off  ::从下一行开始关闭回显
    @echo off 从本行开始关闭回显,一般批处理第一行都是这个
    
    echo 显示当前行是echo off 状态还是echo on 状态
    echo. 输出一个“回车换行”,空白行

    2、窗口设置

    title 设置cmd窗口的标题
    title 新标题
    
    ver 显示系统版本

    3、pause 暂停命令

    让当前进程的暂停一下,并显示:请按任意键继续. . . 用>nul 把这个信息隐藏
    echo 当需要改变提醒的内容时。。。
    pause >nul

    4、goto 和 : 跳转命令

    :label 行首为:表示该行是标签行,标签行不执行操作
    goto label  跳转到指定的标签那一行

    5、:: 或者REM 注释

    ::后的字符在执行 是不会回显,无论echo on 是否打开,REM 在echo on是会回显

    6、set 设置变量

    set 查看环境变量

    set 参数名=参数值

    引用变量 %变量名%

    set aa=rrrrrr
    echo %aa%

    /P 命令行开关允许将变量数值设成用户输入的一行输入

    /A 命令行开关指定等号右边的字符串为被评估的数字表达式

    set /p p=请输入
    set /a rrr=%p%+3
    echo %rrr%
    
    请输入5
    8

    变量在if 、for 复合语句里是一次性全部替换的,可以启用“延缓环境变量扩充”,用!来引用变量,即  !变量名!

    SETLOCAL ENABLEDELAYEDEXPANSION
    set p=aaa
    if %p%==aaa (
        echo %p%
        set p=bbb
        echo %p%
        echo !p!
    )
    		  
    echo %p%
    ENDLOCAL



    7、if 判断命令

    set /p p=请输入
    if %p% LEQ 9 (
     echo %p%
    ) else (
     echo 9
    )
    


     
     

    判断路径是否存在

    if exist %cd%	est.LOG (
    	echo 存在!
    )
    if not exist %cd%	est.LOG (
    	echo 不存在!
    )

    8、for 循环  for/?  查看for的用法

    对一组文件中的每一个文件执行某个特定命令。


    FOR %variable IN (set) DO command [command-parameters]


      %variable  指定一个单一字母可替换的参数。
      (set)      指定一个或一组文件。可以使用通配符。
      command    指定对每个文件执行的命令。
      command-parameters
                 为特定命令指定参数或命令行开关。


    在批处理程序中使用 FOR 命令时,指定变量请使用 %%variable
    而不要用 %variable。变量名称是区分大小写的,所以 %i 不同于 %I.


    如果启用命令扩展,则会支持下列 FOR 命令的其他格式:


    FOR /D %variable IN (set) DO command [command-parameters]


        如果集中包含通配符,则指定与目录名匹配,而不与文件名匹配。


    FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]


        检查以 [drive:]path 为根的目录树,指向每个目录中的 FOR 语句。
        如果在 /R 后没有指定目录规范,则使用当前目录。如果集仅为一个单点(.)字符,
        则枚举该目录树。


    FOR /L %variable IN (start,step,end) DO command [command-parameters]


        该集表示以增量形式从开始到结束的一个数字序列。因此,(1,1,5)将产生序列
        1 2 3 4 5,(5,-1,1)将产生序列(5 4 3 2 1)


    FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
    FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
    FOR /F ["options"] %variable IN ('command') DO command [command-parameters]


        或者,如果有 usebackq 选项:


    FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
    FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
    FOR /F ["options"] %variable IN ('command') DO command [command-parameters]


        fileset 为一个或多个文件名。继续到 fileset 中的下一个文件之前,
        每份文件都被打开、读取并经过处理。处理包括读取文件,将其分成一行行的文字,
        然后将每行解析成零或更多的符号。然后用已找到的符号字符串变量值调用 For 循环

        以默认方式,/F 通过每个文件的每一行中分开的第一个空白符号。跳过空白行。
        您可通过指定可选 "options" 参数替代默认解析操作。这个带引号的字符串包括一个
        或多个指定不同解析选项的关键字。这些关键字为:


            eol=c           - 指一个行注释字符的结尾(就一个)
            skip=n          - 指在文件开始时忽略的行数。
            delims=xxx      - 指分隔符集。这个替换了空格和跳格键的
                              默认分隔符集。
            tokens=x,y,m-n  - 指每行的哪一个符号被传递到每个迭代
                              的 for 本身。这会导致额外变量名称的分配。m-n
                              格式为一个范围。通过 nth 符号指定 mth。如果
                              符号字符串中的最后一个字符星号,
                              那么额外的变量将在最后一个符号解析之后
                              分配并接受行的保留文本。
            usebackq        - 指定新语法已在下类情况中使用:
                              在作为命令执行一个后引号的字符串并且一个单
                              引号字符为文字字符串命令并允许在 file-set
                              中使用双引号扩起文件名称。


        某些范例可能有助:


    FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k


        会分析 myfile.txt 中的每一行,忽略以分号打头的那些行,将
        每行中的第二个和第三个符号传递给 for 函数体,用逗号和/或
        空格分隔符号。请注意,此 for 函数体的语句引用 %i 来
        获得第二个符号,引用 %j 来获得第三个符号,引用 %k
        来获得第三个符号后的所有剩余符号。对于带有空格的文件
        名,您需要用双引号将文件名括起来。为了用这种方式来使
        用双引号,还需要使用 usebackq 选项,否则,双引号会
        被理解成是用作定义某个要分析的字符串的。


        %i 在 for 语句中显式声明,%j 和 %k 是通过
        tokens= 选项隐式声明的。可以通过 tokens= 一行
        指定最多 26 个符号,只要不试图声明一个高于字母 "z" 或
        "Z" 的变量。请记住,FOR 变量是单一字母、分大小写和全局的变量;
        而且,不能同时使用超过 52 个。


        还可以在相邻字符串上使用 FOR /F 分析逻辑,方法是,
        用单引号将括号之间的 file-set 括起来。这样,该字符
        串会被当作一个文件中的一个单一输入行进行解析。


        最后,可以用 FOR /F 命令来分析命令的输出。方法是,将
        括号之间的 file-set 变成一个反括字符串。该字符串会
        被当作命令行,传递到一个子 CMD.EXE,其输出会被捕获到
        内存中,并被当作文件分析。如以下例子所示:


          FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i


        会枚举当前环境中的环境变量名称。


    另外,FOR 变量参照的替换已被增强。您现在可以使用下列
    选项语法:


         %~I          - 删除任何引号("),扩展 %I
         %~fI        - 将 %I 扩展到一个完全合格的路径名
         %~dI        - 仅将 %I 扩展到一个驱动器号
         %~pI        - 仅将 %I 扩展到一个路径
         %~nI        - 仅将 %I 扩展到一个文件名
         %~xI        - 仅将 %I 扩展到一个文件扩展名
         %~sI        - 扩展的路径只含有短名
         %~aI        - 将 %I 扩展到文件的文件属性
         %~tI        - 将 %I 扩展到文件的日期/时间
         %~zI        - 将 %I 扩展到文件的大小
         %~$PATH:I   - 查找列在路径环境变量的目录,并将 %I 扩展
                       到找到的第一个完全合格的名称。如果环境变量名
                       未被定义,或者没有找到文件,此组合键会扩展到
                       空字符串


    可以组合修饰符来得到多重结果:


         %~dpI       - 仅将 %I 扩展到一个驱动器号和路径
         %~nxI       - 仅将 %I 扩展到一个文件名和扩展名
         %~fsI       - 仅将 %I 扩展到一个带有短名的完整路径名
         %~dp$PATH:I - 搜索列在路径环境变量的目录,并将 %I 扩展
                       到找到的第一个驱动器号和路径。
         %~ftzaI     - 将 %I 扩展到类似输出线路的 DIR


    在以上例子中,%I 和 PATH 可用其他有效数值代替。%~ 语法
    用一个有效的 FOR 变量名终止。选取类似 %I 的大写变量名
    比较易读,而且避免与不分大小写的组合键混淆。

    • 这其中有几个点需要注意,首先变量设置只需要使用SET 任意变量名=所要表达的内容;
    • 变量的拼接只要把变量依次写在一起就可以,形如SET 变量=变量1变量2 内容3,字符串4,不同部分之间可以没有连接符,直接相连或者用空格。
    • 变量的截取需要使用固定的格式%变量:~a,b%,这就表示把变量从第a个字符截取到第b个字符,b可以为负数,表示从字符串后面计数,-1表示最后一个字符。
    • 关于例子中信息内容这最后一个参数,其中的双引号使我故意加的,也是非常必要的,这样可以把这句包含空格的话作为一个变量传递到批处理脚本中,如果不加双引号的话,变量Content的内容就是I了,后两个单词就被丢掉了。

    参考:https://www.cnblogs.com/siwuxie095/p/6358173.html

    https://www.cnblogs.com/yezhaohui/p/3642680.html

  • 相关阅读:
    POJ3693 Maximum repetition substring —— 后缀数组 重复次数最多的连续重复子串
    SPOJ
    POJ2774 Long Long Message —— 后缀数组 两字符串的最长公共子串
    POJ3261 Milk Patterns —— 后缀数组 出现k次且可重叠的最长子串
    POJ1743 Musical Theme —— 后缀数组 重复出现且不重叠的最长子串
    SPOJ
    AC自动机小结
    HDU3247 Resource Archiver —— AC自动机 + BFS最短路 + 状压DP
    POJ1625 Censored! —— AC自动机 + DP + 大数
    Herding
  • 原文地址:https://www.cnblogs.com/klb561/p/13793962.html
Copyright © 2011-2022 走看看