バッチファイルでProject Euler(16)

時間計測

%TIME%という特殊な環境変数があり、ここには現在の時刻が格納されています。

echo %TIME%
12:09:22.90

なので、この文字列を区切って時・分・秒にすればよいです。
しかし、この分を次のように取ると、

set t=%TIME%
set /a m = %t:~3,2%
無効な数字です。数値定数は 10 進 (17 桁)、16 進 (0x11 桁)、
または 8 進 (021 桁) です。

というエラーが出ます。最初が0だと8進だと解釈されるんですね。だから09は整数にできないのです。そのために次のようにしましょう。

set /a m = 1%t:~3,2% %% 100

09の前に1をつけて109にして100の剰余を得ます。これで9になります。
このようにして各成分を取って100分の1秒単位の時間を得ます。それをコードの実行の間で取って、それらを引き算します。そのコードが次です。和を取る処理の実行時間を計測しています。

@echo off

set /a N = 60000
call :get_time
set /a t = %ERRORLEVEL%
call :sum %N%
echo %ERRORLEVEL%
call :get_time
set /a t = %ERRORLEVEL% - %t%
echo %t:~0,-2%.%t:~-2%s
exit /b 0

:sum
    set /a s = 0
    for /L %%i in (1, 1, %N%) do set /a s += %%i
    exit /b %s%

:get_time
    setlocal
    set t=%TIME%
    set /a h = %t:~0,2%
    set /a m = 1%t:~3,2% %% 100
    set /a s = 1%t:~6,2% %% 100
    set /a ss = 1%t:~-2% %% 100
    set /a ret = ((%h% * 60 + %m%) * 60 + %s%) * 100 + %ss%
    exit /b %ret%