(for Internet Explorer)
Dim  MakeRule::Priority as integer
優先度。 大きいほど優先する。
(src)
同じ MakeRule::Target の値を持つ MakeRule が複数あるときは、その複数の中で、
MakeRule::Priority が最も大きい MakeRule::Command の関数だけが呼ばれます。
Property Get  MakeRule::NewestSource() as string
最もタイムスタンプが新しい MakeRule::Sources 配列の要素。ファイルパス。
(src)
タイムスタンプを比較するタイミングは、この NewestSource プロパティを参照したときです。
Property Get  MakeRule::AllNewSource() as Array of string
(src)
MakeRule::Sources の中で、ターゲットよりタイムスタンプが新しいファイルパスの配列。
タイムスタンプを比較するタイミングは、この AllNewSource プロパティを参照したときです。
(src)
Function  MakeRule_compare( TargetPath, SourcePath ) as boolean
タイムスタンプを比較して、メイク・コマンドを実行する状況かどうかを返す。
【引数】
TargetPath
SourcePath
ターゲット・ファイルのパス。 メイクルールの : より左側
ソース・ファイルのパス。 メイクルールの : より右側
返り値
メイク・コマンドを実行する状況かどうか
関連
サンプル
  If MakeRule_compare( "dst.txt", "src.txt" ) Then
    copy_ren  "src.txt", "dst.txt"
  End If
.Splitter (=1)
.OutDebugXML (=1)
.BreakBeforeCommand (=2)
.Watch (=4)
取得
get_MakeFileClassConst 関数、MakeFileClass::c、MakeRule::c
メンバー
メイクファイルに関する定数
に、/ChildProcess オプションを付け、XML ファイルによるデータ
メイン・プロセスから、任意のデータ(例:
)を渡し、子プロセスが終了したら
メイン・プロセスに更新された データを返す、といったようなことができます。 このような
データの受け渡しができるようにするのが、/ChildProcess オプションによる子プロセス
の機能です。 OS が定義している子プロセスとは異なります。
cscript sample.vbs /ChildProcess:090401,1
/ChildProcess の右の値は、テンポラリ・フォルダにできるフォルダ名の数値の部分です。
テンポラリ・ファイル名は、下記のとおりです。 %Temp% は、C:\Document 〜 に変わります。
%Temp%\Report\090401\ChildProcess_1\In.xml
%Temp%\Report\090401\ChildProcess_1\Out.xml
参考
vbslib の RunProg 関数で、vbs ファイルを起動すると、自動的に VBScript を起動するときの
メイン・プロセス vbslib (WSH)
子プロセス vbslib (WSH)
の送受信ができるようになっています。 Shell::Run などで起動すると、/ChildProcess オプション
が自動的に付かないので、明示的に指定しない限り送受信できません。
→ テスト情報 I/F
→ T_ChildProcess1.vbs
テスト
(src)
XMLファイル
XMLファイル
vbslib では、エラー処理やデバッグ用に Err2 オブジェクトの送受信を自動的に必ず行います。
→ [T_ChildProcess]
自動的に /ChildProcess オプションを付けないようにするには、/ChildProcess:0 を明示的に
指定します。
r= RunProg( "cscript sample.vbs /ChildProcess:0", "" )
VBScript でエラーを発生させるテストをするときに、/ChildProcess オプションが付くと、
Err2::ErrID などの値がメイン・プロセスから継承された値となり、Err2::ErrID の値が正しいか
どうかのチェックができなくなってしまいます。 それを回避するには、エラーを発生させるテスト・
スクリプトでは、/ChildProcess:0 オプションを付けてください。(下記)
/ChildProcess オプションが(自動的にでも)付くと、エラーレベル(プロセスの返り値)の値が 21
でないとエラーとみなし、メイン・プロセス側でもエラーを発生させます。
参考
cscript sample.vbs
ParentProcess オブジェクトのメンバー
Class  ParentChildProcess
  Public  m_OutFile 'as TextStream (Write) ... 子プロセスへ渡す XML ファイル
  Public  m_InXML 'as IXMLDOMElement ... メイン・プロセスに戻される ルートXML要素

  Public  m_TempPath ' as string. 送受信ファイルができるフォルダのパス
  Public  m_DateID ' as string. 例:"090401". /ChildProcess オプションに渡す値
  Public  m_FileID ' as string. 例:"1". /ChildProcess オプションに渡す値
End Class
  sample.Name = "A" : sample.Value = 1

  '// 子プロセス起動前に、送るオブジェクトをXMLファイルに変換する
  Dim  pr : new_ParentProcess_Object  pr, Empty '//[out] pr as ParentChildProcess
  pr.m_OutFile.WriteLine  sample.xml


  '// 子プロセスを起動する
  Dim r : r= RunProg( "cscript.exe T_ChildProcess1_Sub.vbs", pr )
  CheckTestErrLevel  r


  '// 子プロセス終了後に、戻されたXMLファイルをオブジェクトに戻す
  sample.loadXML  pr.m_InXML.selectSingleNode( _
    TypeName( sample ) +"[@name='"+ sample.Name +"']" )
使用サンプル:
子プロセスに、データを受け渡しするときは、new_ParentProcess_Object で生成した
ParentProcess オブジェクトを RunProg に渡します。
new_ParentProcess で生成した ParentProcess オブジェクトには、他の子プロセスと受け渡し
するファイルの名前が重複しない番号が m_FileID に入っています。 複数の子プロセスを
平行して同時に動かすときは、ParentProcess オブジェクトをもう1つ生成してください。
前の子プロセスが終わってから次の子プロセスを動かすときは、同じ ParentProcess
オブジェクトが使えます。
(src)
pr
vbs_inc モジュールは、vbslib をインクルードする前に自動的に /ChildProcess オプションがあるかどうかを
判定し、あれば ChildProcess オブジェクトを生成します。 ChildProcess オブジェクトは、get_ChildProcess
  Dim  pr, sample

  '// プログラム開始時に、送られてきたXMLファイルをオブジェクトに戻す
  Set pr = get_ChildProcess()  ' as ParentChildProcess
  new_ObjectFromStream  sample, "SampleClass", pr


  '// main
  If not IsEmpty( sample ) Then
    sample.Value = 2
  End If


  '// プログラム終了時に、戻すオブジェクトをXMLファイルに変換する
  If not pr is Nothing Then
    If not IsEmpty( sample ) Then  pr.m_OutFile.WriteLine  sample.xml
  End If
であり、メインプロセスからの情報を m_InXML から入力し、
関数で取得できる
ChildProcess オブジェクトのメンバー
使用サンプル:
Class  ParentChildProcess
  Public  m_InXML 'as IXMLDOMElement ... メイン・プロセスから渡される ルートXML要素
  Public  m_OutFile 'as TextStream (Write) ... メイン・プロセスへ戻す XML ファイル

  Public  m_TempPath ' as string. 送受信ファイルができるフォルダのパス
  Public  m_DateID ' as string. 例:"090401". ファイル名の一部
  Public  m_FileID ' as string. 例:"1". ファイル名の一部
End Class
メインプロセスへ戻す情報を、m_OutFile に出力することができます。

/ChildProcess オプションがないときは、get_ChildProcess 関数が、Nothing オブジェクトを返します。
参考
→ XPath
(src)
Class  InterProcessData  '// defined_as_interface
  Public Sub  OnCallInParent( a_ParentProcess as ParentChildProcess ) : End Sub
  Public Sub  loadXML( XmlObject as IXMLDOMElement ) : End Sub
  Public Sub  OnReturnInChild( a_ChildProcess as ParentChildProcess ) : End Sub
  Public Sub  OnReturnInParent( a_ParentProcess as ParentChildProcess ) : End Sub
End Class

Function  new_InterProcessData()
  Set new_InterProcessData = new InterProcessData
End Function
→ T_ChildProcess2_include.vbs
テスト
ライブラリが自動的に子プロセスに受け渡しをするオブジェクトに必要なインターフェースです。
Dim  g_Sample

Sub  InitializeModule_Sample  '// vbslib モジュールのグローバル・初期化関数
  '// NewChildProcessOnStart の後で
  new_ObjectFromStream  g_Sample, "SampleClass", get_ChildProcess()
  If not IsEmpty( g_Sample ) Then  g_InterProcess.m_Data.Add  g_Sample
End Sub
→ T_ChildProcess2.vbs
参考
参考
→ T_ChildProcess2_Sub.vbs
  '// 子プロセスと送受信するオブジェクトを登録する
  Dim sample : Set sample = new SampleClass  '// has_interface_of InterProcessData
  g_InterProcess.m_Data.Add  sample
子プロセスに渡すオブジェクトは、g_InterProcess.m_Data as ArrayClass に登録してください。
子プロセスのライブラリの初期化(vbslib モジュールのグローバル・初期化関数)で、
get_ChildProcess as ParentChildProcess から、new_ObjectFromStream などを使って、
オブジェクトを受け取ってください。 メイン・プロセスに渡すオブジェクトは、
g_InterProcess.m_Data as ArrayClass に登録してください。
参考
→ T_ChildProcess2.vbs
ライブラリのデータを格納後、g_InterProcess のデータを格納直前に、
+1されます。
(src)
Dim  g_InterProcess ' as InterProcess

Class InterProcess
  Public Property Get  ProcessCallID   '// as ArrayClass of integer
  Public               InterProcessUserData  '// as string
End Class
メイン・プロセスと子プロセスで共有する変数です。
.ProcessCallID  ' as ArrayClass of integer
ProcessCallID(0) = メイン・プロセスが子プロセスを起動した回数。
ProcessCallID(1) = 子プロセスが孫プロセスを起動した回数。
.InterProcessUserData as string
アプリケーション・ユーザーがデバッグ用に使えます
→ [T_ChildProcessID] ProcessCallID や InterProcessUserData
テスト
RunProg
new_ParentProcess
ParentProcess.m_OutFile.WriteLine
AppData.loadXML
Shell::Exec
new_ChildProcess_ifChildProcess
(VBScript global code)
main
get_ChildProcess
new_ObjectFromStream
ChildProcess.m_OutFile.WriteLine
    :
子プロセスのメイン処理
    :
ParentProcess.m_OutFile.WriteLine
アプリケーションからの出力
ライブラリからの出力
ライブラリへの入力
アプリケーションへの入力
アプリケーションからの出力
ResumePop  or  FinalizeInModulesCaller::Class_Terminate
CallFinalizeInModules
ChildProcess.Finish
ChildProcess.m_OutFile.WriteLine
ライブラリからの出力
ライブラリへの入力
アプリケーションへの入力
参考
If TypeName( ParentProcess ) <> "ParentChildProcess" Then  new_ParentProcess
アプリケーションがやり取りするときのみ呼び出す
ParentProcess.OnCallInParent
ParentProcess.OnReturnInParent
ParentProcess.Class_Terminate
受け渡しに使った XML ファイルを削除する
子プロセス起動
子プロセス終了
In.xml
Out.xml
(src)
(src)
(src)
(src)
InterProcessData.OnReturnInChild
InterProcessData.OnCallInParent
InterProcessData.OnReturnInParent
g_InterProcess.OnCallInParent
(src)
InterProcessData.ProcessCallID + 1
ProcessCallID を+1する
InterProcess.OnCallInSub
Set g_ChildProcess = m
InitializeModule (vbslib.vbs)
new_ObjectFromStream
InitializeModule (vbslib または 任意の.vbs)
ParentProcess.m_OutFile.WriteLine
g_InterProcessからの出力
g_InterProcessへの入力
AppData, ChildProcess
InterProcess.OnReturnInChild
ChildProcess.m_OutFile.WriteLine
(src)
g_InterProcessからの出力
InterProcess.OnReturnInParent
new_ObjectFromStream
InterProcess.loadXML
g_InterProcessへの入力
AppData.xml
ParentProcess
(src)
main
Set g_InterProcess = new InterProcess
InitializeModule (vbslib.vbs)
メイン・プロセス起動
g_InterProcess.InterProcessDataArray.Add
InitializeModule (vbslib.vbs または 任意の.vbs)
LibData
プロセスが変わるときにコールバック
するように登録する
LibData
If WScript.Arguments.Named.Item("ChildProcess") Then
プロセスが変わるときにコールバックするように登録する
LibData
g_InterProcess.m_Data.Add
AppData
(src)
Set m_InXML = LoadXML( "Out.xml" )
Set m_InXML = LoadXML( "In.xml" )
(src)
FinalizeModule [vbslib.vbs]
Err2.OnSuccessFinish
エラー関係の調整
Err2 はここ
受け渡しの内容を確認するには
%Temp%\Report\090401\ChildProcess_1\In.xml
%Temp%\Report\090401\ChildProcess_1\Out.xml
下記の XML ファイルを確認してください。
ただし、ParentProcess オブジェクトが削除されたら、XML ファイルも削除されるので注意してください。
参考
アプリケーションからデータが送れない
RunProg の第2引数に、ParentProcess オブジェクトを指定しているか確認してください。
Function  GetEditorCmdLine( PathAndFragment as string ) as string
(src)
【引数】
PathAndFragment
返り値
テキストファイルへのパスと行番号またはキーワード
コマンドライン
サンプル:
start  GetEditorCmdLine( "File1.txt#[Func1]" )
File1.txt を開いて "[Func1]" を含む行にジャンプします
テキストファイルを開くエディタは、
関数を定義することで変更でき
ます。 Setting_getEditorCmdLine の i=2、i=3 のどちらかに対応すれば、指定の行へジャンプ
できます。 i=0、i=1 のどちらかに対応していれば、ファイルを開くことだけはできます。
関連
GetSearchOpenCmdLine は廃止予定です。 GetEditorCmdLine を使ってください。
サンプル:
start  GetEditorCmdLine( "File1.txt(10)" )
サンプル:
start  GetEditorCmdLine( "File1.txt" )
File1.txt を開きます
File1.txt の10行目を開きます
の設定が反映されます。
テキスト・エディターを起動するコマンドラインを返します。
start  GetEditorCmdLine( "File1.txt:10" )
start  GetEditorCmdLine( "File1.txt:[Func1]" )
Function  GetSearchOpenCmdLine( PathAndFragment as string ) as string
参考
PathAndFragment には、タグジャンプ形式の文字列(パス+行番号、または、パス+行内容)
を指定できます。 形式については下記のサンプルを参照してください。
キーワードの直前の文字がコロン ( : ) のときは、数字のみのキーワードを指定できません。
返り値に含まれるファイル・パスは、絶対パスになります。
(廃止予定)
タグジャンプ形式のパスの解析
フォルダーを開く
(廃止予定)
Function  GetDiffCmdLine( PathA as string, PathB as string ) as string
(src)
Diff ツールを起動するコマンドラインを返します。
の設定が反映されます。
start  GetDiffCmdLine( "file1.txt", "file2.txt" )
返り値の例:
"C:\Program Files\Diff.exe" "C:\FileA.txt" "C:\FileB.txt"
Function  GetDiffCmdLine3( PathA as string, PathB as string, PathC as string ) as string
start  GetDiffCmdLine( "file1.txt(5)", "file2.txt" )
file1.txt の 5行目と、それに対応する file2.txt を表示する
start  GetDiffCmdLine3( "file1.txt", "file2.txt", "file3.txt" )
file1.txt、file2.txt、file3.txt を表示する
設定されている Diff ツールが行番号指定に対応していないときは、5行目ではなく先頭の
行を表示します。
設定されている Diff ツールが3つのファイルを同時に比較することができないときは、
3つのファイルのうち、比較する2つのファイルを選択するスクリプト diff3to2.vbs を
起動するコマンドラインを返します。
サンプル
サンプル
サンプル
サンプル
  Dim  folder_a,  folder_b,  step_path

  folder_a = "C:\folder_a\"
  folder_b = "C:\folder_b\"

  Do
    echo  ""
    echo  "2つのフォルダーの中にあるテキストファイルを Diff で表示します"
    echo  folder_a
    echo  folder_b
    echo  ""
    echo  "Enter のみ : 終了"
    step_path = input( "共通の相対パス >" )
    If step_path = "" Then  Exit Do

    start  GetDiffCmdLine( GetAbsPath( step_path, folder_a ), _
                           GetAbsPath( step_path, folder_b ) )
  Loop
相対パスを1つ入力して、Diff を開くプロンプト
Sub  Sleep( msec as integer )
指定した時間だけ待ちます。
【引数】
msec
待つ時間(ミリ秒)
(src)
  Sleep  1000
サンプル:
  Dim  n : For n = 5 To 1 Step -1 : echo  n : Sleep  1000 : Next : echo  0
サンプル:
5秒のカウントダウン
Function  WaitForFile( Path as string ) as string
指定したファイルが作られるまで待ちます。
【引数】
Path
待つファイルのパス
何かの処理(前処理)が終わってから行う処理があるときに使います。
前処理が終わるときに、終わったことを示すファイルを作るようにすれば、
本関数が使えるようになります。
(src)
返り値
ファイルの1行目の内容(末尾に改行文字なし)
本関数から抜ける直前で、対象のファイルを削除します。
  WaitForFile  "Result.txt"
サンプル:
複数のプロセスで通信をするときは、同期に使用するファイルを最終的に
削除する責任を持つ
形にしてください。 そうしないと、同期に使用するファイルを相手に通知する
前に削除してしまう可能性が生まれて、サブ・スレッドが永遠に待ち続ける
ことになってしまいます。
関連
サブ・スレッド (サーバー)
起動
WaitForFile
CreateFile
WaitForFile
CreateFile で終えると
(busy)
delete
待ち続ける...
終了
通信の注意
ホスト側が WaitForFile で待って通信を終える
メイン・スレッド (クライアント)
同期に使うファイルは、2つのスレッド(クライアントとサーバー)で別のファイル名にしてください。
そうしないと、自分が作成(送信)したファイルを待つ(受信する)形になり、待たないことに
なってしまうからです。
送信ファイルを作成する前に、受信したファイルを削除してください。
そうしないと、相手が次の受信ファイルを先に作ってしまい、そのファイルを削除してしまう
からです。 また、前の通信の残りがあるときでも正しく動くように、クライアントは、前の受信
ファイルを削除してから、送信ファイルを作成してください。
→ T_Call_Target.vbs # [T_WaitForFile]
テスト
→ FileT_wait (clib)
エラーを発生させるファイルを作る
WaitForFile で待っているファイルが、XML 形式のテキストで、ルートのタグが <ERROR>
のときは、WaitForFile の内部からエラーを発生させます。
<?xml version="1.0" encoding="Shift_JIS"?>
<ERROR num="3" msg="エラー"/>
作成するファイルの例
上記の場合、Err オブジェクトの内容は、次のようになります。
Assert  Err.Number = 3
Assert  Err.Description = "<ERROR num=""3"" msg=""エラー""/>"
  WaitForProcess  "notepad.exe"
Sub  WaitForProcess( ProcessName as string )
指定したプロセスが終了するまで待ちます。
【引数】
ProcessName
実行ファイル名
ファイル:
テスト
サンプル
→ T_Process.vbs # [T_WaitForProcess]
System.vbs
(src)
Function  EnumProcesses() as dictionary of ArrayClass of integer
プロセスを一覧します。
【引数】
プロセスの一覧。 実行ファイル名をキーとする PID の配列の辞書
返り値
ファイル:
System.vbs
(src)
サンプル
Dim  ps : Set ps = EnumProcesses()
echo  ps.Item( "notepad.exe" )  '// ArrayClass of PID
If not ps.Exists( "notepad.exe" ) Then  '// ps.Item( "notepad.exe" ).Count = 0 は不可
  start  "notepad.exe"
ElseIf ps.Item( "notepad.exe" ).Count >= 2 Then
  echo  "There are 2 processes."
End If
→ tasklist (バッチファイル)
参考
テスト
→ T_Process.vbs # [T_Processes]