コマンドプロンプトの罠(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進数として扱う」
という謎仕様はハマってしまう事もあると思うので、
ここに記す。

技術情報

前の記事

JP1で困ったこと
技術情報

次の記事

ON_ERROR_STOP=1