• 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

  • 相关阅读:
    关于在函数中返回动态的内存
    C与C++中的const
    strcat函数的坑点
    面试题30.最小的k个数
    面试题29.数组中出现次数超过一半的数字
    面试题28.字符串的排列
    面试题27.二叉搜索树与双向链表
    C++中构造函数初始化成员列表总结
    Oracle merge into
    检索 COM 类工厂中 CLSID 解决办法
  • 原文地址:https://www.cnblogs.com/klb561/p/13793962.html
Copyright © 2020-2023  润新知