如何从批处理文件中的字符串中查找Substring作为数字

时间:2017-08-24 12:41:53

标签: batch-file

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

2 个答案:

答案 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开头的任何数字字符串都被解释为八进制数。 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 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 /?