164人参与 • 2024-06-10 • Dos/bat
操作系统不同,日期格式也可能不同:
星期天 2024-05-19
2024-05-19 周日
05/19/2024 sun
sun 05/19/2024
再考虑到中、英之外的其它语言的操作系统,日期格式的种类实在太多了。
要想标准化地获取当前系统日期2008-07-28,直接截取%date%变量的方法是不行的。
比如在windows cmd命令行窗口执行date命令后这个环境变量的值为
那么如下的各个操作的意义如下:
%date:~0,4% 表示从左向右指针向右偏0位,然后从指针偏移到的位置开始提取4位字符,结果是2024(年的值)
%date:~5,2% 表示指针从左向右偏移5位,然后从偏移处开始提取2位字符,结果是05(月的值)
%date:~8,2% 表示指针从左向右偏移8位,然后从偏移处开始提取2位字符,结果是19(日的值)
%date:~5% 表示指针从左向右偏移5位,然后提取所有的值
%date:~-5% 表示指针反方向偏移,从最右端开始,偏移5位,然后从指针处提取左边的所有数值。
注意:“2024-05-19 周日”是个字符串,在计算机里指针是从0开始计数的,所以这串字符的指针意义上的第5位是0,月份的0,取两位刚好是05.
同理,比如当前系统的time变量的值如下:
那么如下的各个操作的意义如下:
%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%
注:md是创建目录的意思
执行后d盘根目录多了一个文件夹
%date:~4,4% 取年
%date:~9,2% 取月
%date:~12,2% 取日
%time:~0,2% 小时
%time:~3,2% 分钟
%time:~6,2% 秒
如:
rem 取系统日期及时间,同时将时间转换为8位(8:16:00-->08:16:00). set curdate=%date:~0,10% set curtime=%time% set hh=%curtime:~0,2% if /i %hh% lss 10 ( set hh=0%curtime:~1,1% ) set mm=%curtime:~3,2% set ss=%curtime:~6,2% set curdatetime=%curdate%_%hh%:%mm%:%ss% set curdatetime
语法:
%变量:~指定偏移量,指定截取字符长度%
如果两者的数值(偏移量或长度)是负数,使用的数字将会是环境变数的长度加上位移或指定长度。我会修正上面帖子中的描述。这里举个例子来说明:
set /p ok=input value of "ok" environment-variable:_
c:\documents and settings\gnaw0725>set /p ok=input value of "ok" environment-var
iable:_
input value of "ok" environment-variable:_1234567890
c:\documents and settings\gnaw0725>echo %ok%
1234567890
c:\documents and settings\gnaw0725>echo %ok:~4,4%
5678
c:\documents and settings\gnaw0725>echo %ok:~-4,4%
7890
c:\documents and settings\gnaw0725>echo %ok:~4,-4%
56
c:\documents and settings\gnaw0725>echo %ok:~-4,-4%
echo is on.
c:\documents and settings\gnaw0725>echo %ok:~,-4%
123456
c:\documents and settings\gnaw0725>echo %ok:~-4%
7890
c:\documents and settings\gnaw0725>echo %ok:~4,%
echo is on.
set扩展命令集有些特殊用法,例如:
%cd% - 展开为含目前目录的字串。(注:这个扩展功能较之for中的%~$path:i的用法要弱的多了)
%random% - 展开为一个在 0 和 32767 之间的整数乱数值。
%errorlevel% - 展开为目前的 errorlevel 值
%cmdextversion% - 展开为目前的扩充指令处理器的版本号码。
%cmdcmdline% - 展开为执行指令处理器前的原始指令行。
这些用法有待以后脚本运用中的实践。
set扩展命令集的帮助信息如下:
显示、设置或删除 cmd.exe 环境变量。
set [variable=[string]]
variable 指定环境变量名。
string 指定要指派给变量的一系列字符串。
要显示当前环境变量,键入不带参数的 set。
如果命令扩展被启用,set 会如下改变:
可仅用一个变量激活 set 命令,等号或值不显示所有前缀匹配
set 命令已使用的名称的所有变量的值。例如:
set p
会显示所有以字母 p 打头的变量
如果在当前环境中找不到该变量名称,set 命令将把 errorlevel
设置成 1。
set 命令不允许变量名含有等号。
在 set 命令中添加了两个新命令行开关:
set /a expression
set /p variable=[promptstring]
/a 命令行开关指定等号右边的字符串为被评估的数字表达式。该表达式
评估器很简单并以递减的优先权顺序支持下列操作:
() - 分组
! ~ - - 一元运算符
* / % - 算数运算符
+ - - 算数运算符
<< >> - 逻辑移位
& - 按位“与”
^ - 按位“异”
| - 按位“或”
= *= /= %= += -= - 赋值
&= ^= |= <<= >>=
, - 表达式分隔符
如果你使用任何逻辑或取余操作符, 你需要将表达式字符串用
引号扩起来。在表达式中的任何非数字字符串键作为环境变量
名称,这些环境变量名称的值已在使用前转换成数字。如果指定
了一个环境变量名称,但未在当前环境中定义,那么值将被定为
零。这使你可以使用环境变量值做计算而不用键入那些 % 符号
来得到它们的值。如果 set /a 在命令脚本外的命令行执行的,
那么它显示该表达式的最后值。该分配的操作符在分配的操作符
左边需要一个环境变量名称。除十六进制有 0x 前缀,八进制
有 0 前缀的,数字值为十进位数字。因此,0x12 与 18 和 022
相同。请注意八进制公式可能很容易搞混: 08 和 09 是无效的数字,
因为 8 和 9 不是有效的八进制位数。(& )
/p 命令行开关允许将变量数值设成用户输入的一行输入。读取输入
行之前,显示指定的 promptstring。promptstring 可以是空的。
环境变量替换已如下增强:
%path:str1=str2%
会扩展 path 环境变量,用 "str2" 代替扩展结果中的每个 "str1"。
要有效地从扩展结果中删除所有的 "str1","str2" 可以是空的。
"str1" 可以以星号打头;在这种情况下,"str1" 会从扩展结果的
开始到 str1 剩余部分第一次出现的地方,都一直保持相配。
也可以为扩展名指定子字符串。
%path:~10,5%
会扩展 path 环境变量,然后只使用在扩展结果中从第 11 个(偏
移量 10)字符开始的五个字符。如果没有指定长度,则采用默认
值,即变量数值的余数。如果两个数字(偏移量和长度)都是负数,
使用的数字则是环境变量数值长度加上指定的偏移量或长度。
%path:~-10%
会提取 path 变量的最后十个字符。
%path:~0,-2%
会提取 path 变量的所有字符,除了最后两个。
终于添加了延迟环境变量扩充的支持。
该支持总是按默认值被停用,但也可以
通过 cmd.exe 的 /v 命令行开关而被启用/停用。请参阅 cmd /?
考虑到读取一行文本时所遇到的目前扩充的限制时,延迟环境
变量扩充是很有用的,而不是执行的时候。
以下例子
说明直接变量扩充的问题:
set var=before if "%var%" == "before" ( set var=after if "%var%" == "after" @echo if you see this, it worked )
不会显示消息,因为在读到第一个 if 语句时,both if 语句中的 %var% 会被代替;
原因是: 它包含 if 的文体
,if 是一个复合语句。所以,
复合语句中的 if 实际上是在比较 "before"
和"after",这两者永远不会相等。同样,以下这个例子
也不会达到预期效果:
set list= for% i in (*) do set list=%list%%i echo%list%
原因是,它不会在目前的目录中建立一个文件列表,
而只是将list 变量设成找到的最后一个文件。
这也是因为 %list% 在
for 语句被读取时,只被扩充了一次;而且,那时的 list 变量是空的。
因此,我们真正执行的 for 循环是:
for% i in (*) do set list= %i
这个循环继续将 list 设成找到的最后一个文件。
延迟环境变量扩充允许你使用一个不同的
字符(惊叹号)在
执行时间扩充环境变量。如果延迟的变量扩充被启用,
可以将上面例子写成以下所示,以达到预期效果:
set var=before if "%var%" == "before" ( set var=after if "!var!" == "after" @echo if you see this, it worked ) set list= for% i in (*) do set list=!list! %i echo %list%
如果命令扩展被启用,有几个动态环境变量可以被扩展,但不会出现在 set 显示的变
量列表中。每次变量数值被扩展时,这些变量数值都会被动态计算。如果用户用这些
名称中任何一个明确定义变量,那个定义会替代下面描述的动态定义:
%cd% - 扩展到当前目录字符串。
%date% - 用跟 date 命令同样的格式扩展到当前日期。
%time% - 用跟 time 命令同样的格式扩展到当前时间。
%random% - 扩展到 0 和 32767 之间的任意十进制数字。
%errorlevel% - 扩展到当前 errorlevel 数值。
%cmdextversion% - 扩展到当前命令处理器扩展版本号。
%cmdcmdline% - 扩展到调用命令处理器的原始命令行。
%highestnumanodenumber% - 扩展到此计算机上的最高 numa 节点号。
一:
@echo off for /f "tokens=2 delims==" %%a in ('wmic path win32_operatingsystem get localdatetime /value') do (set t=%%a) set today=%t:~0,4%%t:~4,2%%t:~6,2%%t:~8,2%%t:~10,2% echo %today% pause>nul
二:
if %time:~0,2% leq 9 (echo %date:~2,2%%date:~5,2%%date:~8,2%0%time:~1,1%%time:~3,2%) else (echo %date:~2,2%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%)
到此这篇关于dos日期获取%date:~0,4%和 %time:~0,2%字符截取操作用法的文章就介绍到这了,更多相关dos日期获取内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论