Cmd:使用batch file处理%date%variables失败

我希望使用批处理命令来parsing%date%variables,得到年/月/日,如下所示:

>echo %date Tue 08/18/2015 

我想parsing%a = 2015,%b = 08,%c = 18,所以我有如下的.bat:

 @echo off rem Get current date and calculate DayOfWeek for /F "tokens=1-3 delims=/" %%a in ("%date%") do ( set /A mm=%%a, dd=%%b, yy=%%c ) 

但它没有执行,说:

 Missing operator. 

如何解决我的.bat文件? 非常感谢。

使用"delims=/""Tue 08/18/2015" Tue 08 "Tue 08/18/2015" "delims=/"中的第一个标记结果显示为Tue 08 。 使用

 @echo off rem Get current date and calculate DayOfWeek for /F "tokens=2-4 delims=/ " %%a in ("%date%") do ( set /A "_mm=1%%a %% 100" set /A "_dd=1%%b %% 100" set /A _yy=%%c ) set _ 

输出:

 ==>D:\bat\SO\32062701.bat _dd=18 _mm=8 _yy=2015 

set /A "mm=1%%a %% 100"技巧防止Invalid number. Numeric constants are either decimal (17), hexadecimal (0x11), or octal (021) Invalid number. Numeric constants are either decimal (17), hexadecimal (0x11), or octal (021)错误。 读整个 set /?http://ss64.com/nt/set.html来解释相同数字的十进制( 17 )与十六进制( 0x11 )与八进制( 021 )的表示。

八进制表示法可能会引起混淆 – 所有以零开头的数字值被视为八进制数,但0809不是有效的八进制数字。 例如, SET /a _month=07将返回值7 ,但SET /a _month=09将返回一个错误。

1%%a意味着字符串1和(评估)的连接。 %%a :如果%%a计算结果为08则结果为108%%是模数运算符的批处理表示法。 因此, 1%%a %% 100意味着除以(整数)除以108之后的余数,即8

要使脚本语言环境独立,请从WMIC输出中提取值:

 wmic os get LocalDateTime | find "." 

或尝试

 wmic path Win32_LocalTime get /value 

解析%date%变量是不可靠的,因为格式会根据机器上的区域/区域/用户设置而变化。

这是获得可靠的日期字符串的一种方法。

 @echo off rem The four lines below will give you reliable YY DD MM YYYY HH Min Sec MS variables in XP Pro and higher. for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a" set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set "DD=%dt:~6,2%" set "HH=%dt:~8,2%" & set "Min=%dt:~10,2%" & set "Sec=%dt:~12,2%" & set "MS=%dt:~15,3%" set "datestamp=%YYYY%%MM%%DD%" & set "timestamp=%HH%%Min%%Sec%" & set "fullstamp=%YYYY%-%MM%-%DD%_%HH%-%Min%-%Sec%-%MS%" echo datestamp: "%datestamp%" echo timestamp: "%timestamp%" echo fullstamp: "%fullstamp%" pause 

如果你只是想在你的电脑上获得DayOfWeek,你有两个简单的解决方案。 第一个是直接从%date%变量“Tue 08/18/2015” :)的第一个单词中获取:

 for /F %%a in ("%date%") do set dow=%%a 

但是如果你想执行数字计算,你可以使用该方法将日期转换为这个答案中显示的Julian Day Number:

 @echo off setlocal rem Modify next line accordingly to your locale format (this one use "Dow MM/DD/YYYY") for /F "tokens=2-4 delims=/ " %%a in ("%date%") do set /A mm=1%%a-100, dd=1%%b-100, yyyy=%%c rem Convert the Date to Julian Day Number, and get its Day Of Week (0=Sunday, ..., 6=Saturday) set /A a=(mm-14)/12, jdn=(1461*(yyyy+4800+a))/4+(367*(mm-2-12*a))/12-(3*((yyyy+4900+a)/100))/4+dd-32075, dow=(jdn+1)%%7 rem Show the result echo Day of week: %dow% 

set命令使用其他答案中解释的技巧来正确获取大于07的以0开头的数字。 例如,如果mont是08 ,那么set /A mm=1%%a-100set /A mm=108-100set /A mm=108-100给出了8。

但是,如果您想在不同的计算机上使用这种方法,可能会有不同的区域设置日期格式,那么您必须使用foxidrive建议的方法。