下面的代码一段时间工作正常,但有些时间显示错误。在MM的情况下,我的输出是8而不是08.但现在我得到08作为一个错误无效数字的字符串。数字常量是十进制(17), 十六进制(0x11)或八进制(021)。
echo off
CD /d C:\Windows\System32\wbem\
FOR /f "skip=1" %%x in ('wmic os get localdatetime') do if not defined MyDate set MyDate=%%x
SET /a YYYY=%MyDate:~0,4%
SET /a MM=%MyDate:~4,2%
SET /a DD=%MyDate:~6,2%
echo %YYYY%
echo %MM%
echo %DD%
答案 0 :(得分:1)
SET /a MM=1%MyDate:~4,2%-100
SET /a DD=1%MyDate:~6,2%-100
是克服此问题的标准方法。
反过来,为了获得2个字符的前导零填充版本,
设置/ MM + = 100 设置“MM =%MM:〜-2%”
答案 1 :(得分:0)
Windows命令解释程序对第三个函数参数0
使用值为base
的C / C ++函数strtol。这意味着以0开头的任何数字字符串都被解释为八进制数。 08
和09
不是有效的八进制数,因为八进制系统只有0到7的数字。
解决方案不是使用算术表达式而是仅使用字符串替换:
@echo off
setlocal EnableExtensions
for /F "tokens=2 delims==." %%I in ('%SystemRoot%\System32\wbem\wmic.exe OS GET LocalDateTime /VALUE') do set "MyDate=%%I"
set "Year=%MyDate:~0,4%"
if "%MyDate:~4,1%" == "0" ( set "Month=%MyDate:~5,1%" ) else set "Month=%MyDate:~4,2%"
if "%MyDate:~6,1%" == "0" ( set "Day=%MyDate:~7,1%" ) else set "Day=%MyDate:~6,2%"
echo Year: %Year%
echo Month: %Month%
echo Day: %Day%
endlocal
此批处理代码输出:
Year: 2017
Month: 8
Day: 24
使用 WMIC 命令的UTF-16 Little Endian编码输出为:
LocalDateTime=20170824150309.315000+120
只有20170824150309
被分配给环境变量MyDate
,因为tokens=2 delims==.
在 FOR 命令行后仅使用字符串,接下来的3个命令行进一步处理替换而不是算术表达式,这对于删除前导零没有帮助。
要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。
echo /?
for /?
if /?
set /?
wmic /?
wmic os /?
wmic os get /?
wmic os get localdatetime /?