読者です 読者をやめる 読者になる 読者になる

CX's Hatena Blog

はてなブログを使ってみるテスト

バッチファイル向け統合開発環境「VisualBat」を試してみる

興味深いツールが公開されていたので試してみました。

【レビュー】編集やデバッグが簡単になるバッチファイル向け統合開発環境「VisualBat」 - 窓の杜

実行結果

デバッグ実行の様子を GIF アニメにしてみました。

f:id:cx20:20140204233453g:plain

プログラムの引数に「abc」を渡すと文字数のカウント結果として「3」(ERRORLEVEL)が返却されることが確認できます。

デバッグ対象のスクリプトについて

テストには以下のバッチファイルを使用しました。

Windowsコマンドプロンプト基礎文法最速マスター - CX's Memo(Windows関連) - Club Windows

このバッチファイルは、引数に指定した文字列の文字数をカウントするプログラムになります。

@ECHO OFF
REM File : GetLength.bat
REM Usage : GetLength.bat abcde
IF "%1"=="" GOTO :EOF
SET /A LENGTH=0
SET LAST=%1

:LOOP
SET /A LENGTH+=1
SET LAST=%LAST:~1%
IF NOT "%LAST%"=="" GOTO LOOP

EXIT /B %LENGTH%

%変数(%i など)をウォッチする機能は無いようですが、動きの追いにくいバッチファイルをデバッグ実行できるのは、重宝しそうです。

なお、デバッグ実行中の変数の書き換えにも対応しているようです。

デバッグ実行の仕組みについて

どうやって実現しているのかが気になって、少し調べてみました。

一時的に、デバッグ用のバッチファイルを生成することで、ステップ実行と変数の取得を実現しているようです。

VisualBat.exe ←┐
 |
cmd.exe  |
 |
VisualBat_xxx_debug.bat |
↓↑↓↑↓↑  |
Breakpoint.exe
VisualBat_xxx_feedback.bat
→┘Breakpoint.exeにてプロセス環境変数を取得し親に返却
feedback.bat はデバッグ中の変数書き換えに対応

以下は、上記のデバッグ実行時に一時的に生成されたバッチファイルになります。

  • VisualBat963306937_debug.bat
@set _errorlevel=0
@"C:\VisualBat\Breakpoint" 963306937 0
@call set _errorlevel=%%errorlevel%%
@"C:\VisualBat\Breakpoint" 963306937 1
@call "C:\Temp\VisualBat963306937_feedback.bat"
@ECHO OFF
REM File : GetLength.bat
REM Usage : GetLength.bat abcde
@call set _errorlevel=%%errorlevel%%
@"C:\VisualBat\Breakpoint" 963306937 4
@call "C:\Temp\VisualBat963306937_feedback.bat"
IF "%1"=="" GOTO :EOF
@call set _errorlevel=%%errorlevel%%
@"C:\VisualBat\Breakpoint" 963306937 5
@call "C:\Temp\VisualBat963306937_feedback.bat"
SET /A LENGTH=0
@call set _errorlevel=%%errorlevel%%
@"C:\VisualBat\Breakpoint" 963306937 6
@call "C:\Temp\VisualBat963306937_feedback.bat"
SET LAST=%1
:LOOP
@call set _errorlevel=%%errorlevel%%
@"C:\VisualBat\Breakpoint" 963306937 9
@call "C:\Temp\VisualBat963306937_feedback.bat"
SET /A LENGTH+=1
@call set _errorlevel=%%errorlevel%%
@"C:\VisualBat\Breakpoint" 963306937 10
@call "C:\Temp\VisualBat963306937_feedback.bat"
SET LAST=%LAST:~1%
@call set _errorlevel=%%errorlevel%%
@"C:\VisualBat\Breakpoint" 963306937 11
@call "C:\Temp\VisualBat963306937_feedback.bat"
IF NOT "%LAST%"=="" GOTO LOOP
@call set _errorlevel=%%errorlevel%%
@"C:\VisualBat\Breakpoint" 963306937 13
@call "C:\Temp\VisualBat963306937_feedback.bat"
EXIT /B %LENGTH%
@"C:\VisualBat\Breakpoint" 963306937 -1

デバッグ実行中の変数の書き換えについては、VisualBat_xxx_feedback.bat というバッチファイルを間に噛ますことで実現しているようです。

  • VisualBat963306937_feedback.bat

以下は、画面より変数 LAST の値を一時的に「abc」→「abcd」に変えた際の内容になります。

@goto _!!
:_!!
@set LAST=^a^b^c^d
@exit /b
:_
@set LAST=^a^b^c^d

SmartScreen について

ちょっと本題から外れますが。。。

VisualBat に限ったことではないですが、Windows 8.1 ではインターネットからダウンロードした EXE を実行しようとすると、初回起動時に SmartScreen によりブロックされるようです。

f:id:cx20:20140204234925p:plain

「詳細情報」を選ぶと「実行」が選べるようになるようです。

このメッセージを初めて見たので、ちょっと身構えてしまいました。

安全の為とは言え、世知辛い世の中になったものです。。。