(for Internet Explorer)
← ▼ ▲
↑
TempParams.txt - C言語のプログラムにデータを渡す
C言語の標準ライブラリだけを使うときは、fgets を使った１行ずつ読み込むような単純なファイル・リード
しかできませんが、VBScript で XML などのデータを整理することで、C言語のプログラムに複雑な
動きをさせることができるようになります。
Test.vbs
C言語のプログラム
T_Test1.xml
TempParams.txt
Sub T_Test1_main( tests, x ) // x is from ReadTestCase
Dim f : Set f = OpenForWrite( "TempParams.txt", Empty )
f.WriteLine x("Param1") & " // Param1"
f = Empty
r= RunProg( "CLangProg.exe /TempParams:TempParams.txt", "" )
del "TempParams.txt"
vbs スクリプトのサンプル (Test.vbs)
ReadTestCase
int Params_read( Params* m, FILE* f );
int T_Sample()
{
int e;
errno_t et;
FILE* f = NULL;
TCHAR s[256];
TCHAR path[256];
//=== ReadTestCase
e= GetCommandLineNamed( _T("TempParams"), false, s, sizeof(s) ); IF(e)goto fin;
e= StrT_getAbsPath( path, sizeof(path), s, NULL );
et= _tfopen_s( &f, path, _T("rt") ); IF(et)goto err_no;
e= Params_read( &params, f ); IF(e)goto fin;
//=== Test Main
// Write here ...
e=0;
fin:
if(f!=NULL){ee= fclose( f ); IF(ee&&!e)e=E_Errno;}
}
int Params_read( Params* m, FILE* f )
{
int e;
int i;
TCHAR line[256];
line[0] = '\0';
_fgetts( line, _countof(line), f );
e= StrT_cutLineComment( line, sizeof(line), line, _T("//") ); IF(e)goto fin;
m->BufferSize = _ttoi( line );
_fgetts( line, _countof(line), f ); // skip space line
e=0;
fin:
return e;
}
C言語のテスト・プログラムのサンプル (CLangProg.exe)
StrT_cutLineComment
TempParams.txt ファイルの データ型の名前
テスト・データが複数のデータ構造を持つときは、データ構造を識別するシンボルを
TempParams.txt ファイルに記述する必要があります。
DataTypeA // データ型の名前
100 // DataTypeA の１つ目のデータ
200 // DataTypeA の２つ目のデータ
DataTypeB // データ型の名前
100 // DataTypeB の１つ目のデータ
200 // DataTypeB の２つ目のデータ
300 // DataTypeB の３つ目のデータ
TempParams.txt ファイルの フラグド構造体パラメーター
→ フラグド構造体パラメーター
参考
TempParams.txt ファイルの基本形
100 // １つ目のテスト・ケースの１つ目のデータ
200 // １つ目のテスト・ケースの２つ目のデータ
110 // ２つ目のテスト・ケースの１つ目のデータ
210 // ２つ目のテスト・ケースの２つ目のデータ
多くの場合、テスト・データを単純に並べていくだけで、テストを実施することはできるでしょう。
テスト・ケースが複数あるときは、空行で区切るとよいでしょう。
clib の StrT_cutLineComment 関数を使えば、コメントを入れることができます。
下記は、struct { int a; int b; } TestData[2]; という構造になります。
１つのテスト・ケースにおいて、それぞれのデータを使うかどうかを表すには、１つ目のデータを
ビットフィールドの数値として使い、ビットが1であれば対応するデータが記述されているように
します。
0x07 // ビットフィールド。 ビット０、１、２が１
100 // １つ目のデータ
200 // ２つ目のデータ
300 // ３つ目のデータ
0x02 // ビットフィールド。 ビット１のみが１
200 // ２つ目のデータ
TempParams.txt
TempParams.txt
TempParams.txt
← ▼ ▲
ReadTestCase 内部のデバッグ
If IsEmpty( g_ReadTestCase ) Then Set g_ReadTestCase = new XmlObjReader
g_ReadTestCase.IsVerbose = True
Skipped
下記のように IsVerbose を True にすると、XML をリードする処理のステップを表示します。
← ▼ ▲
SetReadTestCase
Sub SetReadTestCase( XmlPath as string, TestCaseID as string, Condition as string )
デバッグ用に、テストケースを指定します。
【引数】
XmlPath
TestCaseID
テストケースが書かれた XML ファイルのパス
XML ファイルの中の <TestCase> タグの id 属性の値
Condition
テストケースを指定する条件文
TestScript.vbs
ファイル：
Sub T_Test1( Opt, AppKey )
Dim testcases, x
SetReadTestCase "T_Test1_Data.xml", "TestCase_for_T_Test1", "name='Alphabet'" : Skipped
Set x = ReadTestCase( "T_Test1_Data.xml", "TestCase_for_T_Test1" )
For Each x In testcases.Items '// x は、InputData="ABC" の１回ループのみになる
T_Test1_main Opt, AppKey, x
Next
Pass
End Sub
サンプル・コード：
<?xml version="1.0" encoding="UTF-8"?>
<TestCases>
<TestCase id="TestCase_for_T_Test1">
<SubCase name="Number"
InputData = "123"
Answer = "ans%Num%.txt" _comment2= "FilePath with variable"
/>
<SubCase name="Alphabet"
InputData = "ABC"
Answer = "ans2.txt"
/>
</TestCase>
</TestCases>
サンプル XML ファイル： T_Test1_Data.xml
SetReadTestCase
ReadTestCase
を呼び出す前に、SetReadTestCase を呼び出すコードを追加すると、
ReadTestCase の返り値が、SetReadTestCase で指定した１つのケースだけになります。
(src)
テスト
→ T_TestCaseData.vbs # [T_SetReadTestCase]
Skipped
← ▼ ▲
SetStartSectionTree
Sub SetStartSectionTree( SectionNames as string )
実行するセクションを設定します。
【引数】
SectionNames
セクション名。 CSV形式
ファイル：
vbslib.vbs
SetStartSectionTree "Sec1"
サンプル
SetStartSectionTree "Sec1, SubSec2"
サンプル
Sec1 セクションの中の SubSec2 セクションから実行します。
Sec1 セクションから実行します。
[ 親: SectionTree クラス ]
テスト
→ T_SectionTree.vbs # [T_SectionTree_SetStart]
(src)
関連
→ SectionTree クラス
→ T_SectionTree.vbs # [T_SectionTree_SetStart2]
→ T_SectionTree.vbs # [T_SectionTree_SetStart3]
→ T_SectionTree.vbs # [T_SectionTree_SetStartMiss]
← ▼ ▲
Pass
Sub Pass
テストがパスしたことを、テストスクリプトに知らせて、プログラムを終了します。
(src)
内部的には、エラー 21 が発生します。
→ 正常終了時の動作
テスト
参考
→ T_SomeTests.vbs # T_TestReport
の T_SampA
← ▼ ▲
Fail
Sub Fail
テストが失敗したことを、ユーザーやテストスクリプトに知らせて、プログラムを終了します。
エラーが発生したときと同じ動きをします。つまり、Fail の後は実行しません。
(src)
テスト
→ T_SomeTests.vbs # T_TestReport
の T_SampB
← ▼ ▲
Skip
Sub Skip
テストが実行できる状況ではないことを、テストスクリプトに知らせて、プログラムを終了します。
エラーが発生したときと同じ動きをします。つまり、Skip の後は実行しないで、次のテストを実行します。
(src)
テスト
→ T_SomeTests.vbs # T_TestReport
の T_SampC
← ▼ ▲
Skipped
Sub Skipped
デバッグなどの理由で、テストの一部を一時的にスキップしたことを、テストスクリプトに
知らせます。 Skipped を呼んだテスト項目は、Pass を呼び出しても Fail します。
このときのエラーメッセージは、次のようになります。
(src)
Pass But Skipped. Cut calling "Skipped" function.
テスト
→ [T_Skip] テストをスキップする
← ▼ ▲
ManualTest
Sub ManualTest( TestSymbol as string )
テストが手動テストであることを、テストスクリプトに知らせます。
ManualTest tests.Symbol
サンプル
→ Tests クラス
参考
(src)
手動テストは最低限にしてください。
ManualTest "T_Sample1"
→ テストプログラム作成のヒント
参考
← ▼ ▲
Assert
Sub Assert( Condition as boolean )
条件が満たされているかをチェックします。
満たされていなければ、Fail を呼び出します。
If not Condition Then Fail とほぼ同じですが（違いは下記）、正しい条件文を記述する
ことになるので、ソースの可読性があがります。
また、If 文を使わないので、マルチステートメント（１行に複数の文）が記述できます。
g_debug の設定にかかわらず常にチェックします。
Public Property Let VarA(x) : Assert x >= 0 : VarA = x : End Property
サンプル：
(src)
If Condition と If not Condition は、完全に反対の関係ではありません。
たとえば、If 4 と If not 4 は、どちらも真です。
完全に反対の関係は次のように複数行になります。
If Condition Then
Else
***
End If
よって、正しい条件文を記述することは If Then Fail より Assert の方が簡単になります。
x >= 0
関連
→ Fail
→ Raise
テストが失敗したことを、ユーザーやテストスクリプトに知らせます。
新規にエラーを発生させます。
← ▼ ▲
AssertExist
Sub AssertExist( Path as string )
ファイルまたはフォルダが存在するかどうかをチェックします。
AssertExist "settings.txt"
サンプル：
(src)
存在しなければ、エラーメッセージの中にファイルのパスが含まれます。
このため、デバッガを起動しなくてもユーザーが対応できる可能性が高まります。
エラーコードは、E_PathNotFound になります。
逆に、AssertExist では、存在するときにエラーにすることはできません。
"settings.txt"
エラーメッセージのサンプル
<ERROR msg="ファイルまたはフォルダが見つかりません" path="C:\Folder\setting.txt"/>
→ T_File.vbs # [T_AssertExist]
テスト
関連
→ exist
→ TestCommon_setVariables
参考
Test.vbs で共通のファイルの存在チェック
← ▼ ▲
AssertFC
(src)
Sub AssertFC( Path1 as string, Path2 as string )
2つのテキストファイルを比較して、異なれば diff ツールを開きます。
テキストファイルの文字コードが自動判定できるなら、文字コードが異なっても
テキストが同じであれば、同じと判定します。
文字コードが異なれば必ず異なると判定するときは、
→ % を使った文字列変換関数
参考
Path2 のファイルの内容に、% を使った文字列変換関数を使うことができます。
を使ってください。
IsSameBinaryFile
← ▼ ▲
AssertValue
→ T_Value.vbs # [T_AssertValue]
書きかけ
(src)
← ▼ ▲
ErrorValue
書きかけ
← ▼ ▲
その他
→ ConvertToAbsPath
テキストファイルの中の相対パスを絶対パスに変換します。
← ▼ ▲
性能計測
→ BenchStart
参考
← ▼ ▲
開発環境操作
Visual Studio のソリューションをビルドします
→ devenv_clean
Visual Studio のソリューションをクリーンします
→ devenv_rebuild
→ devenv_build
Visual Studio のソリューションをリビルドします
→ devenv_ver_name 環境変数
関連
→ Module Mixer 3
[ テスト ]
VisualStudio.vbs
ファイル：
→ T_devenv フォルダ
テスト
← ▼ ▲
devenv_rebuild
Sub devenv_rebuild( param as string, config as string )
Dim ds_:Set ds_= new CurDirStack
pushd "src"
devenv_rebuild "sample.sln", "Release"
popd
サンプル：
【引数】
→ Devenv コマンド ライン スイッチ (Web)
→ コマンドライン・コンパイル
VisualStudio
モジュール・シンボル：
(src)
→ devenv_ver_name 環境変数
devenv_rebuild "src\sample_%devenv_ver_name%.sln", "Debug"
VS2008/2005 のソリューションをリビルドします。
SlnPath
ConfigName
ソリューション・ファイル・パス(.sln)
設定名（"Release"など）
ソリューション・ファイルに書かれたバージョン情報を元に、
コンパイラのバージョンを自動的に選択します。
ビルドに失敗したら、E_BuildFail エラーになります。
参考
devenv_rebuild "sample.sln", "Release|x64"
Release|x64 が使えるかどうかは、.sln ファイルをテキストファイル
で開いて、そのコンフィグがあるかどうかで判断してください。
← ▼ ▲
devenv_build
Sub devenv_build( SlnPath as string, ConfigName as string )
VS2008/2005 のソリューションをビルドします。
(src)
参考
→ devenv_rebuild
← ▼ ▲
devenv_clean
Dim ds_:Set ds_= new CurDirStack
pushd "src"
devenv_clean "sample.sln"
popd
Sub devenv_clean( SlnPath as string )
サンプル：
VS2008/2005 のソリューションをクリーンします。
【引数】
SlnPath
ソリューション・ファイル・パス(.sln)
(src)
→ devenv_ver_name 環境変数
参考
← ▼ ▲
devenv_upgrade
Sub devenv_upgrade( SlnPath as string, Opt as Empty )
Dim ds_:Set ds_= new CurDirStack
pushd "src"
devenv_upgrade "sample.sln", Empty
popd
サンプル：
VS2008/2005 のソリューション・ファイルを新しい Visual Studio 用に変換します。
【引数】
SlnPath
古い Visual Studio のソリューション・ファイル・パス(.sln)
→ devenv_ver_name 環境変数
新しいバージョンとは、現在の PC にインストールされている Visual Studio のうち、
最も新しいバージョンのことです。
→ /Upgrade (devenv.exe) (Web)
参考
Opt
Empty または、c.MakeBackup
Opt に、c.MakeBackup を指定すると、変換前のファイルのバックアップを作成します。
ただし、c は、get_VisualStudioConsts の返り値です。
(src)
← ▼ ▲
get_VisualStudioConsts
Function get_VisualStudioConsts() as Object
VisualStudio.vbs で使う定数の集合。
サンプル：
Dim c : Set c = get_VisualStudioConsts()
'// c.MakeBackup
(src)
← ▼ ▲
devenv_ver_name 環境変数
devenv_rebuild "src\sample_%devenv_ver_name%.sln", "Release"
devenv_rebuild, devenv_clean などに指定する .sln ファイルのパスには、
%devenv_ver_name% を指定することができます。
インストールされている Visual Studio に応じて、次の文字列に変換されます。
Visual Studio 2010 … "vs2010"
Visual Studio 2008 … "vs2008"
Visual Studio 2005 … "vs2005"
複数の Visual Studio がインストールされているときは、デフォルトでは最新のものが設定されますが、
PC の環境変数や、SetVar で devenv_ver_name を設定することで、バージョンを選択できます。
get_DevEnvObj
echo "Default: " + GetVar( "%devenv_ver_name%" )
GetVar や env で、devenv_ver_name 環境変数の値を取得するときは、その前に
get_DevEnvObj を実行してください。
(src)
テスト
→ [T_devenv]
→ devenv_ver_name 環境変数
関連
← ▼ ▲
インストール、レジストリ、OS
→ レジストリ (VBS)
レジストリのサブキーを列挙します。
→ RegEnumValues
指定のレジストリ・キーに入っている値を列挙します。
→ RegExport
レジストリ・キーの値を .reg ファイルに出力します。
→ RegWrite
ファイルをダブルクリックしたときに開くプログラムを設定します。
ファイルの右クリック・メニューの１つの項目を追加します。
レジストリにライトします。
→ RegExists
指定のレジストリ・キーか値が存在するかどうかを判定します。
→ バージョン判定、環境変数
→ Shutdown
PC の電源を切ります。
→ RegEnumKeys
→ RegRead
レジストリからリードします。
→ InstallRegistryFileOpen
→ InstallRegistryFileVerb
関連
← ▼ ▲
Shutdown
Sub Shutdown( Operation as string, CountDownTimeSec as integer )
PC の電源を切ります。
【引数】
Operation
CountDownTimeSec
電源の切り方（下記）
電源を切るまでの時間（秒）
ファイル：
vbslib.vbs
SetSuspendState フォルダ
(src)
[ 親: システム、OS、レジストリ ]
サンプル：
RunProg "cscript main_child.vbs", ""
Shutdown Empty, Empty
Function Setting_getShutdownOperation()
Setting_getShutdownOperation = "PowerOff"
End Function
Function Setting_getShutdownCountDownTimeSec()
Setting_getShutdownCountDownTimeSec = 60
End Function
main_child が終了したらデフォルト設定で電源を切る。
30秒後にスリープする
Shutdown "Sleep", 30
サンプル：
デフォルト設定は、
setting フォルダ
に下記の関数の定義によって設定します。
関数定義がないときは、"PowerOff", 60 になります。
Shutdown 関数を呼び出すと、カウントダウンを始め、下記のウィンドウが開きます。
ただし、CountDownTimeSec = 0 のときは開きません。
テスト
Operation 引数
次のいずれかの文字列を指定できます。
"PowerOff", "Reboot", "Hibernate", "Sleep", "Standby"
[OK] を押せば、すぐに電源を切ります。
[キャンセル]を押すか、VBScript の
コンソールを閉じると、電源を切らなく
なります。
→ T_Shutdown_Manually.vbs
スリープするときは、scriptlib\vbslib_XXX\SetSuspendState フォルダが必要です。
それぞれの OS のバージョンで行うこと
エラーが発生しても、電源を切るには、
RunProg などで、メイン処理を行う子プロセス
を起動して、子プロセスが終了する（RunProg から戻る）まで待ってから、Shutdown
を実行してください。 こうすれば、Ctrl-C や閉じるボタンが押されても電源が切れます。
通常 60秒後にシャットダウンします。
サンプル
音楽を鳴らしながら、60秒待ち、スリープする
g_CommandPrompt = 1 '// この行だけ SetupVbslibParameters に記述
Sub main()
Play "******.mp3"
Dim e ' as Err2
If TryStart(e) Then On Error Resume Next
Shutdown "Sleep", 60
If TryEnd Then On Error GoTo 0
e.Clear '// ユーザ・キャンセルしてもウィンドウを閉じるため
End Sub
このスクリプトを、Windows のタスクに登録しておくと、１時間ごとにスリープに入ることを
試みるようなことができます。
参考
→ タスク （Windows でのスケジュール実行）
Windows 7 では、地デジの予約録画などによる、
「半スリープ状態」
から、
Shutdown "Sleep" してもスリープ状態になりません。
wakeonlan : 無停電 Linux サーバーから別の PC の電源を入れる
wakeonlan <電源を入れるPCのMACアドレス>
まず、電源を入れる PC の準備をします。
/usr/bin/net rpc -S <マシン名> -U <アカウント名>%<パスワード> shutdown -t 10
<アカウント名> は、<ユーザ名> または <ドメイン名>\\<ユーザ名>
vbslib Prompt.vbs の Shutdown
電源を落とすには、リモート・デスクトップ経由で、コマンドプロンプトから
を実行するか、無停電 Linux サーバー
から下記のコマンドを入力してください。
Windows XP の場合、
[ スタート > マイコンピューター ] を右クリック [ プロパティ > ハードウェア > デバイス
マネージャ ] から、ネットワーク アダプタの子ノードの中から該当するアダプタを
右クリック [ プロパティ ]、[ 詳細設定 > Wake Up Capabilities ] を [ Magic Packet ]、
[ 電源の管理 > このデバイスで、コンピュータのスタンバイ状態を解除できるように
する ] にチェックします。
PC の電源を切ってから、再度電源を入れてすぐに BIOS の設定画面を開き（機種
依存です。例：F2を押す）、Wake On LAN を有効にします（例：）
『無停電の Linux サーバー』 にログインして、wakeonlan コマンドを実行します。
なお、MAC アドレスは、コマンドプロンプトから ipconfig /all を実行すると分かります。
./wakeonlan 11:22:33:44:55:66
例：
shutdown /s /f
を実行するか、
←
↓