• %date~0,4%和 %time~0,2%等用法详解


    在windows中,有个原始并且功能强大的批处理,好像是被人遗忘了,比如博主最近在一个项目中就用到它,非常好用。今天就和博主一直来看看用批处理生动生成每日的文件夹。

    为了能正确地生成每天的日期文件夹,请先将本机时间的短日期格式设置为yyyy-MM-dd。

    然后就开始写bat批处理文件了,新建一个bat文件,在里面写上:

    @echo off
    F:
    CD dawn
    
    set date=%date%
    set "date=%date:/=-%"
    
    if not exist %date% (  
        MD %date%  
    )
    ::ECHO 目录F:/dawn/dawn_fir/%date%创建成功
    ::PAUSE
    EXIT

    这里做了一个设置,将日期中的/替换成了-,

    如果说想一开机就自动地生成对应的文件夹,就在计划任务(taskschd.msc)中,将这个批处理文件做成一个计划任务即可。

    比如在windowscmd命令行窗口执行date命令后这个环境变量的值为

    当前日期:2014-09-01 星期六 或2014/09/01 周六

    那么如下的各个操作的意义如下:
    %date:~0,4% 表示从左向右指针向右偏0位,然后从指针偏移到的位置开始提取4位字符,结果是2014(年的值)
    %date:~5,2%  表示指针从左向右偏移5位,然后从偏移处开始提取2位字符,结果是03(月的值)
    %date:~8,2%  表示指针从左向右偏移8位,然后从偏移处开始提取2位字符,结果是01(日的值)
    %date:~5%    表示指针从左向右偏移5位,然后提取所有的值
    %date:~-5%   表示指针反方向偏移,从最右端开始,偏移5位,然后从指针处提取左边的所有数值。

    注意:“2014-09-01星期六”是个字符串,在计算机里指针是从0开始计数的,所以这串字符的指针意义上的第5位是0,月份的0,取两位刚好是03.

    同理,比如当前系统的time变量的值如下:

    当前时间: 11:36:56.63

    那么如下的各个操作的意义如下:
    %time:~0,2%  表示从左向右指针向右偏0位,然后从指针偏移到的位置开始提取2位字符,结果是小时字段数值
    %time:~3,2%  表示指针从左向右偏移3位,然后从偏移处开始提取2位字符,结果是分钟字段数值
    %time:~6,2%  表示指针从左向右偏移6位,然后从偏移处开始提取2位字符,结果是秒字段数值
    //创建时间命名的文件夹


    md d:\%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%%time:~6,2%

    --------分析------------

    从set /?中提取的有关帮助: 

        %PATH:str1=str2%
    会扩展 PATH 环境变量,用 "str2" 代替扩展结果中的每个 "str1"。
    要有效地从扩展结果中删除所有的 "str1","str2" 可以是空的。
    "str1" 可以以星号打头;在这种情况下,"str1" 会从扩展结果的
    开始到 str1 剩余部分第一次出现的地方,都一直保持相配。


    也可以为扩展名指定子字符串。
        %PATH:~10,5% 
    会扩展 PATH 环境变量,然后只使用在扩展结果中从第 11 个(偏 
    移量 10)字符开始的五个字符。如果没有指定长度,则采用默认 
    值,即变量数值的余数。如果两个数字(偏移量和长度)都是负数, 
    使用的数字则是环境变量数值长度加上指定的偏移量或长度。 
        %PATH:~-10% 
    会提取 PATH 变量的最后十个字符。 
        %PATH:~0,-2% 
    会提取 PATH 变量的所有字符,除了最后两个。

    ----------------------------------

    用%time:~0,2%%time:~3,2%%time:~6,2%时有个问题, 就是如果TIME 是00点的时候,电脑显示的是0 不是00所以TIME 0~2 就报错了。

    例子:时间9:42:17

    set fileDate=%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%

    for /f "tokens=1,2 delims=:" %%i in ('time/t') do set t=%%i%%j

    set fileDate2=%date:~0,4%%date:~5,2%%date:~8,2%%t:~0,4%%time:~6,2%

    echo fileDate:%fileDate%

    echo fileDate2:%fileDate2%

    fileDate:20150112 94217(9前面是空格)
    fileDate2:20150112094217

    还有些设备的date显示是12/12/2015 周一

    所以用以下方法格式化

    set date=%date:~0,10%
    set date=%date:-=%   //去掉日期中的-
    set date=%date:/=%   //去掉日期中的/
    set time=%time:~0,8%
    set time=%time::=%   //去掉时间中的:

    if "%time:~0,1%"==" " set "time=0%time:~1%"


    ---------------------
    作者:icanlove
    来源:CSDN
    原文:https://blog.csdn.net/icanlove/article/details/42640329
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    剑指offer-面试题23.从上往下打印二叉树
    C++静态成员函数不能调用非静态成员变量
    程序的堆区和栈区
    C++空类的大小
    struct内存对齐
    LeeCode(Database)-Customers Who Never Order
    LeeCode(Database)-Duplicate Emails
    LeeCode(Database)-Employees Earning More Than Their Managers
    LeeCode(Database)-Combine Two Tables
    剑指offer-面试题22.栈的压入,弹出序列
  • 原文地址:https://www.cnblogs.com/johnhery/p/9941963.html
Copyright © 2020-2023  润新知