コマンドプロンプトの罠(8進数問題)
よく、システム時刻(HHMI)を取得しようとして、
以下のように取得する事がある。
SET T=%time: =0%
SET syori_hhmi_1=%T:~0,2%%T:~3,2%
上記の例だと、0埋めしているので、
AM7:00ならば0700という値が変数「syori_hhmi_1」に取得できる。
同じようだが、以下のように取得することもできる。
SET syori_hhmi_2=%time:~0,2%%time:~3,2%
上記の例だと、0埋めしていないので、
AM4:50ならば450という値が変数「syori_hhmi_2」に取得できる。
ここからが問題。
①変数「syori_hhmi_1」 は0700
②変数「syori_hhmi_2」 は450
この①と②をIFなどでバッチスクリプト上比較すると
どちらが大きいのだろうか。
普通に考えると、①の方が値が大きいので、
①>②
になると思ってしまうのだが。。。
コマンドプロンプトには、
「ゼロから始まる変数は8進数として扱う」
という、謎の仕様が存在する。
なので、内部的には
①変数「syori_hhmi_1」 は0700 → 8進数変換し、448
②変数「syori_hhmi_2」 は450
となるので、
①<②
になるのである。
syori_hhmi_1 も syori_hhmi_2もどちらもゼロプレスした値で
比較をすれば、それぞれ8進数として扱った値同士での比較になるので、
上記のような不都合は起きないのだが。。。
「ゼロから始まる変数は8進数として扱う」
という謎仕様はハマってしまう事もあると思うので、
ここに記す。