休止中

青い空 青い海 青い顔 黒い過去

バッチプログラムの限界

趣味:プログラミング

大石泉ちゃん最高。たまらん。特におっぱいが。

f:id:yurikyamome:20160909000630p:plain

 

違います。今日はモバマスの話をするわけではないです。

ちなみに僕は今井加奈ちゃんが一番好きです。

 

自分もプログラミングが趣味の一つなんですけど

我が家のPCにはEclipseみたいな開発環境も無いので

扱うのはVBAとかバッチとかVBSみたいな比較的扱いやすいスクリプト言語です。

エクセルとかメモ帳があれば作れるやつ。

 

色々と自作して楽しんでいるわけですけど壁にぶつかりまして

備忘の意味も含めて残しておこうかな、と。

 

下記のバッチプログラムは非常に簡素なものです。

数字を1ずつカウントアップしてログファイルに書き込んでいき

1000に達したら終了する。っつうものです。

 

CountUpTest.BAT

@echo off
setlocal enabledelayedexpansion

 

rem ◆プロンプト画面のクリア。
cls

 

call :OutputLog ◆◆◆処理開始◆◆◆

echo 処理中...

 

rem ◆カウンタを初期化。
set /A Counter=1
call :OutputLog カウンタ = !Counter!

 

call :CountUp

 

call :OutputLog ◆◆◆処理終了◆◆◆

rem ◆後処理。
endlocal
echo on
exit

rem ===================================
rem ◆カウントアップサブルーチン。
:CountUp
if !Counter! LEQ 999 (
 set /A Counter=!Counter!+1
 call :OutputLog カウンタ = !Counter!
 call :CountUp
)

exit /b

rem ===================================
rem ◆ログ出力サブルーチン。
:OutputLog

echo !date! !time! %* >>LogFile.LOG
exit /b

rem ===================================

 

(こういう時に左側に行番号振るのってどうやるのよ。) 

 

これを実行すると数字が400を超えた辺りで処理が停止しちゃうのよね。

1000まで行かないんですよ。

 

おそらくcallでサブルーチンの呼び出しを繰り返しまくってるのが原因かな?

呼び出し先で更に呼び出して、更にその先で呼び出して…ってのが。

なんて考えてたら下記のようなログが出てきましたよ。

 

****** バッチの再帰数がスタック制限を越えました ******
再帰回数=400, スタック使用率=90 パーセント
****** バッチ処理が中止されました ******

 

どうやら予想通りのようで

呼び出しからの呼び出しからの…って再帰的にやるのも限界があるようです。

 

バッチにもWhile~Do構文みたいのが使えればいいのですが。

もしくは無理にバッチで作らずにVBAで作っちまうか。

FileSystemObjectとか利用すりゃ楽勝だろ。多分。

 

何にせよ、今のままでは駄目っつうことが分かっただけでも収穫ですね。

別の手を考えましょう。

 

以上。

 

【2016/09/09 20時ごろ追記】

callをgotoに書き換えるだけで上手くいきましたね(笑)

そんなもんです。

エラー処理でgotoなんて普通に使ってるのに気付かないものですね。

 

以上。