2017-08-24 157 views
0

下面的代码有些时间工作正常,但有些时间显示错误。在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

现在,我得到,当SET /一个MM =%MyDate时:〜4,2%的结果是08那个时候才得到这个错误。 –

+0

但我想要数字格式,如果结果是05我只需要5.如果我的结果是11或10或12那时我需要11或10或12分别。 –

回答

0

Windows命令解释器使用的C/C++函数strtol与第三功能参数base0。这意味着任何以0开头的数字字符串被解释为八进制数字。 0809不是有效的八进制数为八进制系统仅具有数字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小字节序编码的输出是:

  
  
LocalDateTime=20170824150309.315000+120 
  
  

只有20170824150309被分配到环境中,因为tokens=2 delims==.这是由后只使用字符串替换,未来3个通过命令行命令行,而不是算术表达式在这里是没有帮助去除前导零进一步处理的变量MyDate

为了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。

  • echo /?
  • for /?
  • if /?
  • set /?
  • wmic /?
  • wmic os /?
  • wmic os get /?
  • wmic os get localdatetime /?
1
SET /a MM=1%MyDate:~4,2%-100 

SET /a DD=1%MyDate:~6,2%-100 

是克服该问题的标准方法。

反向,从而获得2个字符的前导零填充的版本,是

集/一个MM + = 100 组 “MM =%MM:〜-2%”

+0

+1处理这个问题的简便方法... _必须记住未来_(我已经使用了Mofi答案的变体,并且明确地检查了过去的前导零)。 – TripeHound

相关问题