(for Internet Explorer)
← ▼ ▲
↑
API
→ _getch, _getche
[ 親: コマンドプロンプト ]
← ▼ ▲
_getch
_getche
int _getch( void );
キーボードからの入力を１文字取得します。 入力があるまで待ちます。
[ 親: コマンドプロンプトAPI ]
MSDN(Web)
#include <conio.h>
/***********************************************************************
<<< [getYesNo] Yes か No をユーザに尋ねる >>>
【引数】
・int default; Enter のみ押したときの返り値
・int ctrl_c; Ctrl+C を押したときの返り値
・int 返り値; Yes=1, No=0
************************************************************************/
int getYesNo( int _default, int ctrl_c )
{
int b = -1;
for (;;) {
int c = _getch();
if ( c == '\r' ) { printf( "\n" ); break; }
if ( c == 0x03 ) { printf( "^C\n" ); b = -2; break; } /* Ctrl+C */
if ( c == 0x08 ) { printf( "\b \b" ); b = -1; continue; } /* BS */
if ( c != 'Y' && c != 'y' && c != 'N' && c != 'n' ) continue;
if ( b != -1 ) printf( "\b" );
printf( "%c", c );
b = ( c == 'Y' || c == 'y' ); /* Y=1, N=0 */
}
if ( b == -1 ) b = _default; /* デフォルト */
else if ( b == -2 ) b = ctrl_c; /* Ctrl+C */
return b;
}
サンプル：
← ▼ ▲
_getcwd
サンプルコード
char* _getcwd( char* cwd, int cwd_size );
カレントフォルダを取得します。
【引数】
cwd
cwd_size
（出力）カレントフォルダ
メモリサイズ
MSDN(Web)
[ 親: コマンドプロンプトAPI ]
wchar_t* _wgetcwd( wchar_t* cwd, int cwd_m );
cwd_m
最大文字数+1
cwd、エラー=NULL
返り値
→ GetCurrentDirectory
TCHAR* _tgetcwd( TCHAR* cwd, int cwd_size );
キーワード：
カレントディレクトリ、カレントフォルダ
#include <direct.h>
TCHAR cwd[4096];
IF ( _tgetcwd( cwd, _countof(cwd) ) == NULL ) {e=E_OTHERS; goto fin;}
→ _tchdir
関連
_tgetcwd
← ▼ ▲
バッチファイルを使ったテストの自動化
→ プログラムの起動
→ プログラムの返り値のチェック （エラーレベル）
→ 全テスト実行バッチ、バッチファイルのリターン値
→ テスト用フォルダをリセット（削除＆コピー）
clean,bat もあります
→ テストバッチのテンプレート
通常はこれをコピーして使います
→ コマンドライン・コンパイル
→ 出力結果に絶対パスがあるとき
→ バージョン別パッケージ
→ コピーファイル同期
← ▼ ▲
テストバッチのテンプレート
→ テスト用フォルダをリセット（削除＆コピー）
→ テストプログラムの起動
→ プログラムの返り値のチェック
テンプレート：
含まれている内容：
→ test_template.lzh
→ test_template_snote.lzh
一般用、テストのみ
SnapNote 用、テストのみ
→ コマンドライン・コンパイル
関連
→ カレントフォルダを取得する
一般用、全部（ビルド、テスト、リリース）
→ プロジェクト・テンプレート
標準出力をチェックする簡易自動テストバッチ
→ FCBat
← ▼ ▲
FCBat テストツール
T_ALL_5_do_test.bat
T_ALL_7_clean.bat
T_Func.vbs
T_Func_ans.txt
T_Func_log.txt
T_ALL_result.txt
すべてのテストスクリプトを起動し、出力をチェックする
すべてのテストの出力を削除する
テスト・スクリプト（テスト・プログラム）の例
正しい出力の例
（テストを実行すると出力されるファイル） 出力の例
（テストを実行すると出力されるファイル） 全体の結果
すべてのテストを実施する
T_ALL_5_do_test.bat をダブルクリックするとテストが始まります。
すべてのテストスクリプトを起動して、出力をチェックします。
すべての出力があっていたかどうかは、出力の最後の数行を確認してください。
Test log compare ...
Pass.
合っているとき
誤っているときの例
Fail in T_Func.vbs
Test log compare ...
Fail.
１つのテストをデバッグする
set T=T_Sample
echo ^<^<^< [%T%] ^>^>^>
( cscript %2 //nologo %T%.vbs %3 2>&1 ) > %T%_log.txt
fc %T%_ans.txt %T%_log.txt
if errorlevel 1 echo Fail in %T%.vbs>> T_ALL_result.txt&goto :last_of_test
T_ALL.bat は、下記のようなスクリプト（ブロック）が集まったものです。
１つのブロックが、１つのテストの実行に対応しています。
環境変数 T がテストシンボルです。必要に応じて変えてください。
（テストシンボル）＋.vbs を起動しています。
（テストシンボル）＋_log.txt が出力内容を記録したファイルです。
デバッグするときは、デバッグするテストに対応するブロックを先頭にコピーし、
ブロックの前後に、下記のように記述します。
echo on
（ブロック）
pause
テストを追加する
上記のブロックをコピーして、環境変数の値を修正します。
上記は、VBScript を起動していますが、別のプログラムを起動してもかまいません。
標準出力をチェックする自動テストバッチ。
構造はシンプルですが、取り扱いが少し不便です。
T_ALL_5_do_test.bat が、それぞれのテスト・プログラムを起動します。
→ テストを追加する
→ １つのテストをデバッグする
→ すべてのテストを実施する
ファイル構成
→ fc
参考
関連
→ 出力結果に絶対パスがあるとき （T_ALL_4_setup.bat）
複数のフォルダに、T_ALL_5_do_test.bat があるときは、ファイル名で検索して
すべて手動で起動してください。
手動テストを一覧する
自動テストの結果に手動テストを一覧することで、、テスターに残りのテストを通知
します。 下記のように T_ALL_result.txt に出力すると、最後にまとめて表示されます。
echo [ManualTest] %T% >> T_ALL_result.txt
[ManualTest] T_Test1
[ManualTest] T_Test2
Test log compare ...
Pass.
バッチファイル
表示例
→ 手動テストを一覧する
→ テストツール
Fail したテスト項目を特定する
→ Fail したテスト項目を特定する
テストに失敗すると、T_ALL_result.txt に、失敗したテスト項目が記録されます。
T_ALL_result.txt は、T_ALL_5_do_test.bat が echo 出力したものなので、
T_ALL_5_do_test.bat の内容を調べることで、問題があったコマンドラインを確認できます。
Fail in T_Func.vbs
Test log compare ...
Fail.
Fail したときのT_ALL_result.txt の例：
→ テスト・プロンプト (Test.vbs)
pause までたどり着いたら Pass です。
バッチファイルの動きを表示します。
(新規)
FCBat テストツール(.zip)
(help)
出力ファイルをチェックする
→ 出力ファイルをチェックする
set T=T_TestSet
echo ((( [%T%] )))
del "Test_logs.txt"
( %CL% %T%.vbs /set_input:2. 2>&1 ) > %T%_log.txt
fc "%T%_log.txt" "%T%_ans.txt"
if errorlevel 1 echo Fail in %T%.vbs>> T_ALL_result.txt&goto :last_of_test
findstr /C:"+ 1) T_TestSet" "%T%_log.txt"
if errorlevel 1 echo Fail in %T%.vbs>> T_ALL_result.txt&goto :last_of_test
出力内容をすべて比較する。
出力内容の一部を比較する。
→ findstr
参考
FCVbs テストツール フォルダ
← ▼ ▲
出力結果に絶対パスがあるとき
エラー in C:\folderA\folderB\out.txt
C:\folderA がソースをインストールした任意のフォルダで、次のような出力結果が正しいとき、
out_ans.txt
そこで、out_ans.txt をバッチファイルで作成することで、インストールした状態が変わっても
自動的に判定することができるようになります。
C:\folderA の部分は、インストールした状態によって変わってしまいます。
つまり、単純なファイルの比較で、出力結果が正しいかどうかを自動的に判定することが
できません。
pushd ..\..
set base=%cd%
popd
set out=out_ans.txt
if exist %out% del %out%
echo エラー in %base%\folderB\out.txt>>%out%
echo.>>%out%
set out=
set base=
T_ALL_4_setup.bat
←ここを修正する
←ここで絶対パスを得る
絶対パスをすべて大文字にするとき
ツールによっては出力結果を勝手に大文字だけにするものがある。
これに対処するには、次のようにして、大文字だけが入った base_i 環境変数を使う。
cscript //nologo set_base_i.vbs > _set.bat & call _set.bat & del _set.bat
echo %base_i%\FILE.TXT
T_ALL_4_setup.bat
Set g_sh = WScript.CreateObject("WScript.Shell")
WScript.Echo "Set base_i="+ UCase( g_sh.CurrentDirectory )
set_base_i.vbs
Test.vbs
Sub test_setup( tests )
Dim base : base = g_sh.GetAbstructPathName( "..\.." )
Dim f : Set f = g_fs.CreateTextFile( "out_ans.txt", True, False )
f.WriteLine "エラー in " + base + "\folderB\out.txt"
f.WriteLine ""
Pass
End Sub
echo エラー in %base%\folderB\out.txt
echo.
out_ans.txt
..\..
out_ans.txt
"エラー in " + base + "\folderB\out.txt"
..\..
← ▼ ▲
バージョン別パッケージ (ver_pack)
内部用と公開用、外部依存モジュールあり/なし、ソースパッケージとバイナリパッケージ、
のようにファイルの構成が大きく異なるときは、１つのフルパッケージから、それぞれの
パッケージを自動的に作成できるようにするとよいでしょう。
REM --- package name ---
set p=ModuleA
call :rmdir %p%
REM --- copy folder ---
call :copy ..\Modules_src\ModuleA %p%\ModuleA
if %r%==1 goto :eof
call :copy ..\Modules_src\ModuleB %p%\ModuleB
if %r%==1 goto :eof
modules_src
ModuleA
ModuleB
_pack
ModuleA_src
Modules_src
サンプル・パッケージの構成例
ModuleA_make.bat
Modules_make.bat
フルパッケージ
ModuleA のみのパッケージ
ModuleA と ModuleB を組み合わせたパッケージ
ModuleA_src フォルダを作成するバッチファイル
Modules_src フォルダを作成するバッチファイル
最小限のパッケージに必要なもの
・ライブラリのソース、またはバイナリ
・ライブラリを使うアプリのサンプル
→ 最小限のパッケージ
コンパイルエラーとリンクエラーをチェックするために、最低限下記のものが必要です。
この構成で、動作確認を行います。
rmdir, copy サブルーチンを使ったサンプル：
サンプル：
→ ver_pack.lzh
Modules_src
マスターファイル（コピー元）
ModuleA_patch
ModuleA をコピーした後に上書き修正するファイル
← ▼ ▲
コピーファイル同期
@echo off
if "%~1"=="" cmd /K %0 /wnd %1 %2 %3 %4
shift
pushd ..
REM base folder is vbslib_new
echo base folder is %cd%
echo OK?
pause
set src_name=vbs_inc.vbs
set src=TestByFCBat\vbs_inc\vbslib\%src_name%
for /R %%i in (%src_name%) do (
if exist "%%i" if not "%cd%\%src%"=="%%i" (
fc /A "%src%" "%%i"
if errorlevel 1 explorer /select, "%%i"&goto fin
)
)
:fin
echo.
echo done in %cd%
echo.
popd
set src_name=
set src=
比較＆選択
echo %%i
xcopy /D "%src%" "%%i"
コピー
fc の行を変えます
src_name と src を、
マスターファイルの
パスにします
複数のフォルダにある同じ名前のファイルの内容を同じにします。
内容が異なると、マスターではない方のファイルを自動的に選択します。
← ▼ ▲
プロジェクト・テンプレート (auto.bat)
do.bat
project_template
src
test
alltest
test1
alltest.bat
call_do.bat
do_each.bat
setting.bat
(a) メイン・バッチ
(d) 内部用（コール・バッチ）
(c) フォルダ一覧 （要修正）
(b) 環境変数設定 （要修正）
do.bat
(e) クリーン、ビルド、テストなどを実行 （要修正）
(e) クリーン、ビルド、テストなどを実行 （要修正）
ファイル構成
コールツリー
alltest.bat
setting.bat
do_each.bat
call_do.bat
do.bat
(a) メイン・バッチ
(b) 環境変数設定 （要修正）
(c) フォルダ一覧 （要修正）
(d) 内部用（コール・バッチ）
(e) クリーン、ビルド、テストなどを実行 （要修正）
使い方
>auto
全フォルダのクリーン→リビルド→テストを実行します。
バッチファイルを起動するときは、カレントディレクトリに起動するバッチファイルが
ある状態で行ってください。
all
デフォルトの実行を表示して確認してから実行します。
>do build
１つのフォルダのリビルドを行います。
auto.bat と do.bat のパラメータに指定できるのは、次のとおりです。
(なし)
全フォルダのクリーン→ビルド→テスト→クリーンを実行します。
build
test
clean
リビルドを実行します。
テストを実行します。
クリーンを実行します。
全フォルダ(alltest.bat)、または１つのフォルダ(do.bat)に対して、ビルドやテストなどを行います。
→ 使い方
テンプレート
→ ファイル構成
→ コールツリー
処理内容テンプレート
→ 処理内容テンプレート
if exist Build.dat del Build.dat
if exist Build.wrn del Build.wrn
if exist Build.err del Build.err
if exist Build.log del Build.log
set rmdir_path=obj
if exist %rmdir_path% rmdir /S /Q %rmdir_path%
if exist %rmdir_path% echo cannot delete %rmdir_path% & set r=1& goto :eof
set rmdir_path=
→ clean
PB delete
→ コマンドライン・コンパイル(VS2005)
→ batchlib.lzh
→ vbslib.lzh
vbslib 製テスト・プロンプトをお使いください。
← ▼ ▲
テスト用フォルダをリセット（削除＆コピー）
echo ----- reset test folder -----
if exist test_do rmdir /S /Q test_do
mkdir test_do
xcopy /E /Y original test_do
echo cd .. & a.bat > a.bat
original フォルダ
テストを実行するバッチファイルの一部
リセット状態のファイル構成が入ったフォルダ
test_do フォルダ
リセットするテスト実施用フォルダ
test_do フォルダを一度削除し、originai フォルダの内容と一致させます（リセットします）。
[ 親: バッチファイルを使ったテストの自動化 ]
clean.bat
for /D /R %%i in (test_do) do if exist "%%i" rmdir /S /Q "%%i"
テスト終了後に、すべての test_do フォルダを削除します
← ▼ ▲
echo off
echo ----- setup tools -----
call ..\common\setting.bat
if (%test_prog%)==() echo not set %%test_prog%% & set r=1 & if (%no_pause%)==() pause & goto :eof
if not exist %test_prog% echo not found %test_prog% & set r=1 & if (%no_pause%)==() pause & goto :eof
set case=test1
echo ----- %case% -----
%test_prog% %case% > %case%_out.txt
%feq% %case%_out.txt %case%_ans.txt
if errorlevel 1 echo NG & set r=1 & if (%no_pause%)==() pause & goto :eof
set r=0 & echo Pass. if (%no_pause%)==() pause
REM ----- common setting -----
set test_prog="..\..\Debug\prog.exe"
テストプログラムの起動
プログラムのパスは、デバッグ版とリリース版、また、Program Files に入っていたりして、
変わることがよくあります。 そこで、各テストバッチファイルから、テストグループ共通の
setting.bat を呼び出すようにします。
setting.bat
a.bat （一般的なテストバッチのサンプル）
[ 親: バッチファイルを使ったテストの自動化 ]
clean.bat
del out1.txt
← ▼ ▲
notepad
notepad.exe は、結果の表示に使うことができます。
if "%notepad%"=="" start "" notepad log.txt
if not "%notepad%"=="" start "" %notepad% log.txt
下記のバッチファイルは、notepad 環境変数が設定してあったら、別のプログラムで
log.txt を表示します。
me 設定
set notepad="C:\Program Files\sted\sted.exe"
← ▼ ▲
全テスト実行バッチ
all_test.bat
echo off
pushd test1
call test1.bat
popd
if not %r%==0 echo NG & set r=1 & goto :eof
set r=0 & echo Pass.
:eof2
if "%1"=="" pause
各テストのバッチファイルを呼び出し、テスト結果が入った環境変数をチェックします。
最後に表示される Pass か NG で全テストの結果を判定をします。
set errorlevel しても if errorlevel で判定できません。
[ 親: バッチファイルを使ったテストの自動化 ]
← ▼ ▲
.exe 形式の main 関数の返り値は、エラーレベルに格納されます。
if errorlevel 1 echo NG & set r=1 & goto :eof
1以上ならNG
エラー処理、プログラムの返り値のチェック （
if not errorlevel 1 echo NG & set r=1 & goto :eof
0 なら NG
echo %errorlevel% でエラーレベルの値が分かります。
errorlevel
）
、
エラーレベル
環境変数 r に代入していますが、これは、後述する全テスト実行バッチのためです。
set r=0 & echo Pass.
:eof2
if "%1"=="" pause
NG が無く、バッチファイルの最後まで来たら、次のように Pass したことを明示します。
[ 親: バッチファイルを使ったテストの自動化 ]
→ 一般的なテストバッチのサンプル
参考
errorlevel 構文を使う
errorlevel 変数を使う
cscript sample.vbs
if not "%errorlevel%"=="21" ( echo ERROR & pause & exit /b 1 )
Windows2000以降？
cmd /v:on /c "prog1 & echo exit /b !ERRORLEVEL! > _tmp.bat" | prog2
call _tmp.bat
echo %ERRORLEVEL%
パイプの前段のエラーレベルを知りたいとき
→ それはそれ。これはこれ。 (Web)
関連
→ 終了コード （Linux）
エラーレベルを設定する
バッチ・ファイルから返すエラーレベルは設定できません。
exit /b 1 で呼び出し元へ戻ります。 1 は %errorlevel% に設定する値です。
exit 1 ですぐにバッチファイルを終了します。 1 は %errorlevel% に設定する値です。
exit に引数を指定しなければ、%errorlevel% の値は変わりません。
→ Error
→ ClearError
エラーをそのまま返す
call :T_Example
if errorlevel 1 ( exit /b )
呼び出し先でエラーが発生したら、すぐにそのエラーを呼び出し元に返します。
関連
if や for の ( ) の中で errorlevel 変数を参照しないでください。
errorlevel 構文を使ってください。
call :T_Example
if errorlevel 1 ( exit /b )
( ) の前の errorlevel 変数の値が参照されてしまいます。
if や for の ( ) の中でも、直前の呼び出しによって設定された errorlevel をチェックします。
←
↓