2017-08-24 156 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

相關問題