2017-08-24 10 views
0

コードの下には、ある程度うまくいきますが、エラーが表示されることがあります。前のMMのケースでは、私の出力は08ではなく8でした。しかし、今はエラーが無効な文字列として08を取得しています。数値定数は、10進数(17)、 16進数(0x11)、または8進数(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/a MM =%MyDate:〜4,2%の結果は、このエラーが発生するのは08時です。 –

+0

しかし、結果が05の場合は数値形式が必要です。私は5が必要です。その結果が11または10または12の場合、それぞれ11または10または12が必要です。 –

答えて

0

Windowsコマンドインタープリターは、第3の機能パラメータbaseの値0とC/C++の関数strtolを使用しています。これは、0から始まる任意の数値文字列が8進数として解釈されることを意味します。

@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 

このバッチコードを出力:進システムは、溶液は、算術式を使用して、代わりに単なる文字列の置換を使用していない0〜7

数字のみを有するもの0809は、有効な8進数ではありません:

Year: 2017 
Month: 8 
Day: 24 

使用WMICコマンドのUTF-16リトルエンディアン符号化出力は次のとおり

0のみ
  
  
LocalDateTime=20170824150309.315000+120 
  
  

は、環境変数MyDateため、先行ゼロを削除するには、ここで何の助けをされていないだけで、文字列置換を使用してコマンドラインFOR 後の次の3つのコマンドラインではなく、算術式でさらに処理されtokens=2 delims==.のに割り当てられています。

使用されているコマンドとその動作方法を理解するには、コマンドプロンプトウィンドウを開き、次のコマンドを実行して、コマンドごとに表示されているすべてのヘルプページをすべてよく読んでください。

  • 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

関連する問題