←
▼
▲
Sub Pause()
続行するには Enter キーを押してください . . .
コマンドプロンプトにメッセージを表示して、Enter キーを押すまで待ちます。
メッセージの内容:
vbslib.vbs (src)
サンプル:
echo "処理を開始します。"
If not ArgumentExist( "silent" ) Then Pause
デバッグするときは、Pause より MsgBox を使った方がよいでしょう。
Pause は、子プロセスがからむと、メッセージが表示されない可能性があるためです。
silent
"処理を開始します。"
Pause
ファイル:
vbslib.vbs
Pause
サンプル:
vbslib_mini.vbs (src)
←
▼
▲
Sub pause2()
コマンドプロンプトを使う .vbs ファイルをダブルクリックしたときだけ pause します。
プログラムの最後で pause2 すると、コマンドプロンプトに出力した内容を確認できます。
ソース
→ vbslib.vbs
←
▼
▲
Sub PauseForDebug()
呼び出し元がデバッグ モードのときに、実行を一時停止します。
ソース
→ vbslib.vbs
次のように表示されて一時停止します。
a と Enter : 今後は止めない
続行するには Enter キーを押してください . . .
a (Enter) が入力されると、それ以降の PauseForDebug では何もしません。
デバッグ モードの内容は、PauseForDebug を呼び出すモジュールによります。
←
▼
▲
Function Input( Prompt as string ) as String
プロンプトを表示し、ユーザからのキーボード入力を待ちます。
【引数】
Prompt
返り値
表示する内容
ユーザが入力した文字列、入力なし=""
→ vbslib.vbs#CUI
Dim key
key = Input( "キーワードを入力してください >" )
echo key
テスト
サンプル
254文字以上は入力できません。
コマンドプロンプトから入力した場合、128文字以上を入力したときに日本語文字が入って
いると、128文字目付近の文字が消えてしまうため、 InputBox を使って再入力を要求します。
コマンドプロンプトから入力した場合、128文字目が日本語文字の場合は、cscript.exe が、
例外を発生してしまいます。
関連
Ctrl+C を押すと、プログラムは中断します。エラーにもなりません。
ファイル:
vbslib.vbs
Input
key = Input( "〜します。[Y/N]" )
If key <> "y" and key <> "Y" Then _
Exit Sub ' ... Cancel
→ vbslib_mini.vbs
→ vbslib.vbs
ソース
echo "1. コマンドAを起動する [CommandA]"
echo "2. コマンドBを起動する [CommandB]"
echo "9. 終了 [Exit]"
key = Trim( Input( "番号またはコマンド名>" ) )
Select Case key
Case "1": key = "CommandA"
Case "2": key = "CommandB"
End Select
If StrComp( key, "CommandA", 1 ) = 0 Then
:
ElseIf StrComp( key, "Exit", 1 ) = 0 Then
Exit Do
End If
←
▼
▲
input や pause 関数を使った場合、自動的にキー入力することもできます。
関連
←
▼
▲
次のようにすると、input を呼び出したときに、自動的に [1][Enter][2][Enter] と入力します。
Sub set_input( Keys as string )
(src)
でユーザーが入力する内容を、指定した内容で自動的に入力するようにします。
g_CUI.m_Auto_KeyEnter = "."
set_input "1.2."
子プロセスに set_input の内容を引き継ぐには、下記の手順をしてください。
関連
テスト
g_CUI.m_Auto_KeyEnter = "/"
set_input "1/2/"
Enter に対応する文字をピリオドから変更したいときは、次のようにします。
オプションによる指定は無視されます。
を呼び出した後で、set_input を呼び出すと、/set_input
ファイル:
vbslib.vbs
と SetAutoKeysFromMainArg で、または、
を使う子プロセスに g_InputCommand_Args(の一部)を渡すことで、
子プロセスに入力内容を渡します。 サンプル
←
▼
▲
cscript.exe を起動したときのパラメータに、/set_input オプションを指定すると、
input などでユーザーが入力する内容を、オプションに指定した内容で自動的に入力します。
g_CUI.SetAutoKeysFromMainArg
cscript.exe sample.vbs /set_input:1.2.
VBS のソースに必要な呼び出し
コマンドライン
(src)
ただし、main 関数の先頭などで g_CUI.SetAutoKeysFromMainArg を呼び出す必要があります。
関連
テスト
←
▼
▲
cscript.exe を起動したときのパラメータに、/set_input_enter オプションを指定すると、
/set_input に指定した文字のうち、/set_input_enter オプションで指定した文字は、Enter の
入力にします。
/set_input_enter オプションが指定されなかったときは、ピリオドが Enter の入力になります。
cscript.exe sample.vbs /set_input:1.2. /set_input_enter:.
コマンドライン
(src)
日本語文字を指定すると、すべてのAscii 文字が使えるようになります。
←
▼
▲
g_CUI.m_Auto_DebugCount = 1
cscript.exe sample.vbs /set_input:1.2. /set_input_debug:1
VBS のソース
コマンドライン
を指定したときに、1つずつ Enter キーを入力するまで待ちます。
(src)
関連
指定した値の回数目の入力から待ちます。
これにより、ユーザーの入力を自動的に行うときに、入力内容を確認しながら実行できます。
←
▼
▲
や
で cscript.exe を起動したプロセスで input を使うと、
標準入力待ちでハングアップするので、代わりに内部で、GUI から入力する
が呼ばれます。
InputBox が呼ばれるかどうかは、スクリプトを起動したときに指定するコマンド
ライン・オプションに /GUI_input:1 を指定したかどうかで決まります。 RunProg
で、cscript を起動すると、/GUI_input:1 は、自動的に指定されます。
子プロセスで pause したとき、pause メッセージを子プロセスから受け取ったら
親プロセスで、Enter の入力待ちをします。 Enter を押したら、子プロセスの
標準入力にも Enter を転送します(EchoStream関数)。 自動入力するときは、
pause メッセージに少し手を加えて、親プロセスで待たないようにします。
input を呼び出したとき、コマンドライン・スクリプトでも、強制的に GUI から入力する
オプションです。
cscript Sample.vbs /GUI_input
起動コマンドの例:
テスト
参考
→ vbslib.vbs
ソース
←
▼
▲
Function InputPath( Prompt as string, Flags as integer ) as string
プロンプトを表示し、ユーザからファイルのパス(場所)の入力を待ちます。
【引数】
Prompt
Flags
表示する内容
0 または c.CheckFileExists など(下記)
ユーザが入力したパス、入力なし=""
返り値
ユーザは、 " "で囲んだパスを入力することができます。このとき、返り値は、" " を含みません。
サンプル
Set c = g_VBS_Lib
echo "[SampleTool]"
path = InputPath( "path>", c.CheckFileExists or c.CheckFolderExists or _
c.UseArgument1 or c.AllowEnterOnly )
If path = "" Then path = GetPathOfClipboardText()
(src)
Flags 引数
[SampltTool]
path>aaa
not found
path>C:\
下記を設定します。 複数設定するときは、or してください。 c は g_VBS_Lib です。 何も設定しない
ときは、0 を指定してください。
ファイルとして存在するかチェックします。
フォルダとして存在するかチェックします。
何も入力しなかったときに再入力を要求しません。 このとき、返り値=""
ファイル:
vbslib.vbs
関連
テスト
→ Test.vbs # T_InputPath_WorkFolder_File
サンプル画面
サンプル
Dim path, param
If ArgumentExist( "Path" ) Then
path = WScript.Arguments.Named.Item( "Path" )
echo "パス>"+ path
Else
path = InputPath( "パス>", Empty )
End If
param = input( "Param>" )
Linux のパスも入力できるようにするとき
Linux のパスは、オプションと解釈されてしまうため、/Path オプションを使って指定して
ください。
cscript Sample.vbs /Path:/home/user1/file Param2
→ Test.vbs # T_InputCommand_WindowsParam
→ Test.vbs # T_InputCommand_LinuxParam
→ Test.vbs # T_InputPathArg
スクリプトを起動したときの第1パラメーターがあれば、それを入力とする (*1)
スクリプトを起動したときの第2パラメーターがあれば、それを入力とする (*1)
InputPath
(*1)
で指定した自動入力の内容や
UseArgument1 や UseArgument2 を指定した場合、
は、次の番目に進みません。 次の自動入力や
パラメーターの番目がいくつのときでも指定した番目のものが入力できるからです。
c.AllowWildcard
ワイルドカードが入力できるようにします。
相対パスを入力したら、
を基準とした相対パスとみなし、返り値は、フル パスに
なります。 InputPath を呼び出す前に、g_start_in_path は、変更することができます。
${ から始まる入力をしたときは、フル パスを値に持つ
であるとして、フル パスに
しません。
←
▼
▲
Sub InputCommand( LeadOrOpt as string or InputCommandOpt, Prompt as string,
Opt as variant, AppKey as AppKeyClass )
に入ります。 入力するコマンドは、呼び出す関数の名前です。
【引数】
LeadOrOpt
Prompt
リード文、または、オプション
プロンプトの表示内容。 Empty="番号またはコマンド"
Main 関数の AppKey 引数
AppKey
Main 関数の Opt 引数
Opt
(src)
Sub main2( Opt, AppKey )
InputCommand "Document.svg を参照 (Google Chrome や Snap Note で見えます)", _
"コマンド >", Opt, AppKey
End Sub
Sub SyncSymbols( Opt, AppKey )
echo "SyncSymbols 関数が呼ばれました。"
End Sub
サンプル
実行画面
--------------------------------------------------------------------------------
Document.svg を参照 (Google Chrome や Snap Note で見えます)
コマンド >SyncSymbols
--------------------------------------------------------------------------------
SyncSymbols 関数が呼ばれました。
--------------------------------------------------------------------------------
Document.svg を参照 (Google Chrome や Snap Note で見えます)
コマンド >
FuncA コマンドを実行したところ
ユーザーが入力したコマンドと同じ名前の関数が呼ばれます。 たとえば、SymcSymbols と入力したら、
ImputCommand 関数の中から、GetRef 関数を使って、SymcSymbols 関数が呼ばれます。 呼ばれる
関数の引数は、main2 関数と同じ、Opt と AppKey にしてください。
InputCommand
SyncSymbols
Sub Main( Opt, AppKey )
Set o = new InputCommandOpt
o.Lead = "Document.svg を参照 (Google Chrome や Snap Note で見えます)"
Set o.CommandReplace = Dict(Array( "1","RunProgram", "2","InvestigateLog" ))
Set o.MenuCaption = Dict(Array( "1","起動コマンド [%name%]" ))
InputCommand o, Empty, Opt, AppKey
End Sub
Sub InvestigateLog( Opt, AppKey )
Set c = g_VBS_Lib
path = InputPath( "ログ・ファイルのパス >", c.CheckFileExists )
key = input( "よろしいですか。[Y/N]" )
If key<>"y" and key<>"Y" Then Exit Sub ' ... Cancel
Investivate path
echo "解析しました。"
End Sub
メニューから選択する
-------------------------------------------------------------------------------
Document.svg を参照 (Google Chrome や Snap Note で見えます)
1. 起動コマンド [RunProgram]
2. InvestigateLog
番号またはコマンド >2
-------------------------------------------------------------------------------
ログ・ファイルのパス >C:\Log\Test_log.txt
よろしいですか。[Y/N]y
解析しました。
下記はメニュー2を選んだところ。 2 の代わりに InvestigateLog も入力できます。
実行画面
→ T_InputCommand_Manually.vbs # main
テスト
Class InputCommandOpt
Public Lead '// as string
Public CommandReplace '// as Dictionary of string
Public MenuCaption '// as Dictionary of string
Public AllTestName '// as string
End Class
InputCommand
コマンド >SyncSymbols
Sub SyncSymbols( Opt, AppKey )
echo "SyncSymbols 関数が呼ばれました。"
End Sub
ImputCommand Empty, "コマンド >"
C:\Log\Test_log.txt
vbslib.vbs
ファイル:
InputCommand 関数を呼び出すスクリプトは、起動するときに専用コマンドをパラメーターに指定すると、
ユーザの入力待ちにはならず、InputCommand 関数の中からすぐに専用コマンドに対応する関数を呼び
出すようになります。 関数から返ったら(InputCommand から返り)、スクリプトのプロセスは終了します。
専用コマンド名の次やそれ以降のパラメーター(上記の C:\folder\file.txt と y )は、内部で
に渡されて、自動的に入力するようになります。 ただし、Enter の入力は "." と記述するのではなく、
パラメーターの区切りが Enter の入力になります。 Enter のみの入力をしたいときは、下記のように
cmd.exe から起動して、"" を指定してください。
y
2
関連
→ T_InputCommand_Target2.vbs # [main2]
→ T_InputCommand_Target.vbs # [main2]
→ Test.vbs # T_InputCommand_Param
Dim r
r = RunProg( "cscript.exe //nologo """+ SearchParent( "Prompt.vbs" )+_
""" CommandA param1 """"", "out.txt" )
CheckTestErrLevel r
Assert "out.txt", "T_ans.txt"
del "out.txt"
コマンド >CommandA
入力1 >param1
入力2 >
実行しました。
親フォルダーにある Prompt.vbs から起動できるショートハンド・プロンプトに、
CommandA コマンドを入力、入力1に param1 を入力、入力2に Enter のみ
入力するときの、テスト・スクリプトは、下記のようになります。
Prompt.vbs
CommandA
param1
""""
コマンド入力するときに、「AllTest」 と入力すると、InputCommandOpt クラスの CommandReplace に登録
した関数をすべて呼び出します。 コマンド名を 「AllTest」 以外にしたいときは、InputCommandOpt クラスの
AllTestName を設定してください。
Dim r
r = RunProg( "cscript //nologo T_Target.vbs AllTest", "" )
CheckTestErrLevel r
参考
CommandA
param1
T_ans
Sub CommandA( Opt, AppKey )
dbg = Opt("command_debug")
Set c = g_VBS_Lib
If dbg Then g_CUI.m_Auto_KeyEnter = "/"
If dbg Then set_input "C:\Folder\File1.txt"
path = InputPath( "ファイルのパス >", c.CheckFileExists )
:
End Sub
Sub CommandA_debug( Opt, AppKey )
Opt("command_debug") = True
CommandA Opt, AppKey
End Sub
dbg = Opt("command_debug")
If dbg Then g_CUI.m_Auto_KeyEnter = "/"
If dbg Then set_input "C:\Folder\File1.txt"
Sub CommandA_debug( Opt, AppKey )
Opt("command_debug") = True
CommandA Opt, AppKey
End Sub
下記のようにして、CommandA_debug コマンドを起動すると、入力する内容を自動的に入力します。
プロンプトのみ(メニュー項目なし)
キーワード:
すぐに関数を呼び出したかどうかをスクリプト内で判断したいときは、
g_InputCommand_Args
.Count
が 1 以上かどうかで判定します。
CommandReplace は、要素番号 0 から始まる配列で、
要素番号が偶数の要素は、コマンドの番号または略称、
要素番号が奇数の要素は、実行する関数名です。
Lead は、ショートハンド・プロンプトの最初に表示される「リード文」です。
MenuCaption は、要素番号 0 から始まる配列で、
要素番号が偶数の要素は、コマンドの番号または略称、
要素番号が奇数の要素は、ショートハンド・プロンプトに表示されるメニュー項目です。
←
▼
▲
Dim g_InputCommand_Args as array of string
のパラメーター。
g_InputCommand_Args(0) は、専用コマンド名、g_InputCommand_Args(1) 以降は、パラメーターです。
Set parameters = new_ArrayClass( g_InputCommand_Args )
If parameters.Count >= 1 Then _
parameters.Remove 0, 1 '// Remove special command name
parameters = CmdLineFromStr( parameters.Items )
set_input "" '// 現在のプロセスに設定されている自動入力データをクリアする
RunProg "cscript //nologo Prompt.vbs CommandX_Child "+ _
parameters +" /g_debug__:1", ""
サンプル
子プロセスにパラメーターを渡します。
g_InputCommand_Args.Count = 0 のときは、対話式のショートハンド・プロンプトが使われてます。
g_InputCommand_Args.Count >= 1 のときは、ショートハンド・プロンプトをバッチ処理で実行しています。
←
▼
▲
Function ChangeNumToCommandOrNot( in_Key as string, in_CommandDictionary as dictionary of string, _
in_NumName as string, in_IsInputNumOrCommand as boolean ) as string
リストとコマンド番号が重なったときは、どちらかキーボードから選択するようにユーザーに要求しjます。
【引数】
in_Key
in_CommandDictionary
入力した番号の文字列
コマンド名の辞書。 キー=番号の文字列
リストの項目の名前
in_NumName
→ T_Value.vbs
テスト
→ vbslib.vbs
ソース
返り値
番号(リストの項目の番号の文字列)、または、コマンド名
in_Key の番号にリストの項目があるかどうか
in_IsInputNumOrCommand
←
▼
▲
(src)
参考
Sub SendKeys( WindowTitle as string, KeyCords as string, LateTime as integer )
キーボード入力をエミュレーションして自動的にキー操作をします。
【引数】
WindowTitle
KeyCords
"" または、キーボード・コードを送るウィンドウのタイトル(下記)
キーボード・コード (下記)
LateTime
0 または、キーボード・コードを送るまでの時間(ミリ秒)
WindowTitle 引数に指定した文字列が、ウィンドウのタイトルに、前方一致、または、
後方一致したウィンドウに対して、キー操作をします。
SendKeys "メモ帳", "%FS", 200
サンプル:
WindowTitle 引数
KeyCords 引数
制御キーの入力は、次のように指定します。
[Alt]+[F], [S]
"%FS"
[Ctrl]+[C]
"^C"
[Enter]
"{ENTER}"
キー入力
KeyCords 引数
[Esc]
"{ESC}"
"{TAB}"
[Tab]
Alt キーを押しながら F、離して S
説明
シフトキーを押しながら連続して、X、P
"+XP"
シフトキーを押しながら、X、離して、P
[Shift]+[X], [P]
[Shift]+[X], [Shift]+[P]
"+(XP)"
[+]
"{+}"
その他のキー
[{]
"{{}"
[[]
"{[}"
ファイル:
vbslib.vbs
テスト
→ T_UI1_Manual.vbs # SendKeys
LateTime 引数
キーコードを送る前に待つ時間を指定します。
直前の処理がウィンドウを開く処理など、キーコードを送る対象が準備できるまでに
時間がかかるときに指定してください。
Alt キー + [F] + [S] …… 保存