←
▼
▲
Function RunBat( CommandLines as string, Redirect as string ) as integer
指定したバッチを新プロセスで実行します。 終了を待ちます。
【引数】
CommandLines
バッチファイルに記述する内容
出力先のファイルパス, "" または Empty で標準出力のみ
返り値
エラーレベル
Redirect
r= RunBat( _
"nmake -f makefile" +vbCRLF+_
"@if errorlevel 1 goto fin" +vbCRLF+_
"del *.obj" +vbCRLF+_
":fin", _
Empty )
If r <> 0 Then Raise 1, "<ERROR msg='バッチ処理でエラーが発生しました'/>"
If not exist( "sample.dll" ) Then Fail
関連
サンプル
バッチを終了するときは、goto :eof を使わずに、最後の行に到達するようにしてください。
ソース
→ vbslib.vbs
←
▼
▲
Function RunBatAsync( CommandLines as string ) as RunBatAsyncClass
指定したバッチを新プロセスで実行します。 終了を待ちません。
【引数】
CommandLines
バッチファイルに記述する内容
返り値
実行状況を確認するためのオブジェクト
ソース
返り値の .Status と .ExitCode は、
の返り値と同じです。
バッチを終了するときは、goto :eof を使わずに、最後の行に到達するようにしてください。
Set exec = RunBatAsync( _
"copy a.txt b.txt" +vbCRLF+_
"goto :fin" +vbCRLF+_
":fin" +vbCRLF+_
"" )
Do
If exec.Status = g_VBS_Lib.WshFinished Then
echo exec.ExitCode
Exit Do
End If
Loop
サンプル
→ vbslib.vbs
RunBatAsync は、echo 出力されません。
デバッグ用に echo 出力を確認したいときは、一時的に RnuBat を使用してください。
→ T_Download.vbs
テスト
T_SetVirtualFileServer_Files
VirtualServerAtLocal::DownloadAsyncExec の中で使用
←
▼
▲
ソース
テスト
→ T_CS_Script.vbs
→ System.vbs
Function CompileCSharp( in_SourceFilePath as string ) as CompileCSharpClass
C#言語のソース ファイルをコンパイルします。
【引数】
in_SourceFilePath
C#言語のソース ファイルのパス
返り値
サンプル
←
▼
▲
の返り値。 C#言語をコンパイルした実行ファイル。
サンプル
←
▼
▲
Function sudo( CmdLine as string, OperationName as string,
StdoutStderrRedirect as string ) as integer
指定したコマンドラインを管理者権限を持った新プロセスで実行します。 終了を待ちます。
【引数】
CmdLine
StdoutStderrRedirect
コマンドライン(実行ファイルパス+パラメータ)
"" を指定してください
返り値
エラーレベル(main 関数の返り値)
関連
Windows Vista/7 では、起動する直前に、下記のメッセージを出力します。 更にユーザー
アクセス制御(UAC)による管理者への昇格の許可も求められます。 ユーザーが心配
しないよう、OperationName 引数に、行おうとする処理の名前を的確に指定してください。
-------------------------------------------------------------------------------
[ UAC(ユーザーアカウント制御)予告(詳細) ]
詳細情報1:
"C:\home\InstallSample.vbs"
詳細情報2:
C:\home>
cscript CopyProgram.vbs
-------------------------------------------------------------------------------
[ UAC(ユーザーアカウント制御)予告 ]
『Sample アプリケーションのインストール』という処理の続きを "管理者権限ランチャー
(sudo.exe)"から実行します。
これが、あなたがしようとしている処理と異なるときや、あいまいな処理名のときは、
終了してください。
続行するには Enter キーを押してください . . .
↓
→ T_sudo フォルダ
テスト
If GetOSVersion() >= 6.0 Then
未対応
(src)
Enter キーを押すと
sudo が出すメッセージ (実行前)
sudo "cscript CopyProgram.vbs", _
"Sample アプリケーションのインストール", ""
sudo が出すメッセージ (実行後)
↓
「はい」 をクリックすると
管理者権限で行う処理が完了し、管理者権限は失効しました。
sudo に指定したプログラム、cscript CopyProgram.vbs を、新規プロセスで起動
↓
プログラムが終了したら
サンプルコード:
内部コールツリー
sudo (vbs)
sudo.exe
"cscript T_sudo_c_target.vbs"
T_sudo_c_Manual.vbs
cmd /C
T_sudo_c_target.vbs
if not ""%errorlevel%""==""21"" pause
親プロセス、一般ユーザー
cmd /C "temporary.bat"
"temporary.bat"
子プロセス、管理者
孫プロセス、管理者
ひ孫プロセス、管理者
echo %errorlevel% > errorlevel.txt
エラー時に pause する
T_sudo_c_target.vbs
wscript
cscript
玄孫プロセス、管理者
OperationName
ユーザーが行おうとしている処理の名前
2秒間表示されます。
通常時
デバッガ使用時
親プロセス、一般ユーザー
"cscript //x T_sudo_c_target.vbs"
sudo (vbs)
T_sudo_c_Manual.vbs
sudo.exe
cmd /C "cscript //x ***.vbs" /debug:1
子プロセス、管理者
***.vbs
cscript
孫プロセス、管理者、デバッガ接続
sudo で起動する .vbs スクリプトのプロセスをデバッグするときは、CmdLine 引数に、
cscript のオプション //x 、または /g_debug オプションを付けてください。
Windows Vista/7 の場合
デバッガに接続するには
sudo "cscript //x CopyProgram.vbs", _
"Sample アプリケーションのインストール", ""
sudo "cscript CopyProgram.vbs /g_debug:1", _
"Sample アプリケーションのインストール", ""
Windows XP では、管理者へログインする設定にすると、起動時に管理者のパスワードを
入力するようになります。 自分が管理者であるときは、入力を求められません。
未対応
Windows XP の場合
←
▼
▲
Sub sudo_del_copy( in_SudoScriptPath as string, in_OperationName as string,
in_SourceFullPath as string, in_DestinationFullPath as string, Option_ as Empty )
(src)
管理者権限が必要なら、権限を取得して、フォルダーを置き換えます。
【引数】
in_SudoScriptPath
in_SourceFullPath
一時的に作成する管理者権限で実行するスクリプトのパス
置き換えた後の内容が入ったフォルダーのフル パス
in_DestinationFullPath
置き換える対象のフォルダーのフル パス
in_OperationName
ユーザーが行おうとしている処理の名前
Empty、または、除外する相対パスの配列
Option_
管理者権限が必要かどうかは、in_DestinationFullPath が Program Files または Program Files (x86)
フォルダーの中にあるかどうかを内部で判定します。
Option_ 引数に文字列の配列を指定すると、その文字列が相対パスとして、そのパスにある
ファイルやフォルダーを削除しません。 in_SourceFullPath 引数が指すフォルダーにあるときの
動作は未定義です。
←
▼
▲
%〜% で囲まれた環境変数の名前を環境変数の値に展開します。
Function env( s as string ) as string
(src)
引数に Empty が指定されると Empty を返します。
指定した環境変数が定義されていないときは、エラー E_NotFoundSymbol = &h80041006 になり
ます。
SetVar で設定した環境変数も展開します。
path = env( "%windir%" )
サンプル:
環境変数 windir を展開する
path = env( "%windir%\system32" )
サンプル:
環境変数以外も指定できます。
関連
テスト
→ T_Var.vbs # [T_Var1]
paths = env( Array( "%windir%", "%windir%\system32" ) )
Assert IsSameArray( paths, Array( "C:\Windows", "C:\Windows\system32" ) )
引数に配列を指定すると、それぞれの配列要素にある環境変数を展開します。
ローカル環境変数の値が配列のとき、配列要素に環境変数があれば、それも展開します。
SetVar "VarA", 1
SetVar "VarB", 2
SetVar "VarC", Array( "X%VarA%X", "X%VarB%X" )
Assert IsSameArray( env("%VarC%"), Array( "X1X", "X2X" ) )
→ 環境変数を参照する (Excel)
%% は、% に置き換わります。
%0〜%9 は展開しません。 また、閉じる % も不要です。
←
▼
▲
コマンドラインの1行を解析して、それぞれの項目を配列に格納する。
Function ArrayFromCmdLine( CmdLine as string ) as array of string
For Each column In ArrayFromCmdLine( "Sample.exe ""file (1).txt"" /opt1:2" )
echo column
Next
【引数】
CmdLine
返り値
コマンドラインの1行
(出力)それぞれの項目が入った配列
サンプル
上記 ArrayFromCmdLine の返り値は、Array( "Sample.exe", "file (1).txt", "/opt1:2" )
(src)
関連
→ T_CmdLine.vbs # [T_ArrayFromCmdLine]
テスト
それぞれの項目は、空白文字によって分割されます。
タブルクォートの中にある空白文字は、項目の分割になりません。
両端のダブルクォートは、項目に含まれません。
ダブルクォートは閉じてなくても構いません。
タブルクォートで囲まれている部分の前または後が空白文字ではないときは、それらも
1つの項目の中に含まれます。 その際、ダブルクォート文字は含まれません。
abc "def ghi" "j k
abc
def ghi
abc def
def
abc
abc"def" ab"c d"ef
abcdef
abc def
ダブルクォート文字を項目に含めるときは、\" と記述します。
" " で囲まれた中でも外でも同じです。
ab\"cd "12\"34"
12"34
ab"cd
\ が n 文字あって直後に " があるときは、n が偶数なら、\ 文字が n/2 文字と " " の
囲みの開始になります。 n が奇数なら、\ 文字 (n-1)/2 文字と " 文字になります。
" " で囲まれた中でも外でも同じです。
j k
\ の直後が " ではないときは、\ が連続していても、そのまま項目に入ります。
\\pc\n
\\pc\n
\" \\\" \\\\\" \\"a b" \\\\"c d"
"
\"
\\"
\a b
\\c d
"\" \\\" \\\\\" \\"a b" \\\\"c d"
" \" \\" \a
b \\c
d
参考
その他の形式から配列
パラメーターを記録する
←
▼
▲
コマンドラインの1行を解析して、オプション以外の項目を配列に格納する。
Function ArrayFromCmdLineWithoutOpt( CmdLine as string, OptionSigns as variant )
as array of string
arr = ArrayFromCmdLineWithoutOpt( "Sample.exe ""file (1).txt"" /opt1:2 param2", Empty )
【引数】
CmdLine
OptionSigns
コマンドラインの1行
オプション記号の配列、または Empty(= "/", "-")
サンプル
上記 ArrayFromCmdLineWithoutOpt の返り値は、Array( "Sample.exe", "file (1).txt", "param2" )
(出力)それぞれの項目が入った配列
返り値
←
▼
▲
コマンドラインの1行を解析して、オプション名をキーとした辞書を返します。
Function DicFromCmdLineOpt( CmdLine as string, OptionNames as array of string )
as dictionary of string or True
Dim params : Set params = DicFromCmdLineOpt( _
"Sample.exe /opt1:2 -flag param", Array( "/opt1", "-flag", "/no_opt" ) )
Assert IsSameArray( params( "no name" ), Array( "Sample.exe", "param" )
Assert params( "/opt1" ) = "2"
Assert params( "-flag" ) = True
Assert params( "-flag" )
Assert not params( "/no_opt" )
Assert IsEmpty( params( "/no_opt" ) )
【引数】
CmdLine
返り値
コマンドラインの1行
(出力)オプション名をキーとした辞書
オプションではないパラメーターは、キー "no name" の、配列型の値に格納されます。
オプションは、キーがオプション名、値が文字列型、True、Empty のいずれかになります。
サンプル
OptionNames
オプション名の配列
複数指定ができるオプションは、OptionNames に指定するオプション名の後に "::"
(コロン×2)を付けてください。 このとき、辞書の値は配列になります。
オプション名と値の間に空白文字が含まれる場合は、OptionNames に指定する
オプション名の後に ":" (コロン)を付けてください。
Dim params : Set params = DicFromCmdLineOpt( _
"-o value1 value2", Array( "-o:" ) )
Assert params( "-o" ) = "value1"
Assert IsSameArray( params( "no name" ), Array( "value2" )
Dim params : Set params = DicFromCmdLineOpt( _
"-o value1 -ovalue2", Array( "-o::" ) )
Assert IsSameArray( params( "-o::" ), Array( "value1", "value2" ) )
(src)
→ T_CmdLine.vbs # [T_DicFromCmdLineOpt]
テスト
関連
←
▼
▲
i = 1
Do
s = MeltCmdLine( cmdline, i )
If i = 0 Then Exit Do
Loop
コマンドラインの1項目を取り出し、通常の文字列に戻す。
Function MeltCmdLine( Line as string, in_out_Start as integer ) as string
【引数】
CmdLine
in_out_Start
コマンドラインの内容
(入力) 取り出しを開始する文字の位置、(出力)次に取り出す〜
返り値
取り出したコマンドラインの1項目
次の項目が無いときは、in_out_Start=0 になります。
(src)
→ T_CmdLine.vbs # [T_MeltCmdLine]
テスト
関連
サンプルデータ
sample.exe param1 "param 2"
次の順番で返ります
sample.exe
param1
param 2
サンプル
サンプル
Assert MeltCmdLine( """double_quotation""", 1 ) = "double_quotation"
←
▼
▲
関連
コマンドラインが入った文字列を解析して、それぞれの引数を配列などに格納する。
Function ParseCmdLine( CmdLine as string ) as CmdLineArgs
Set args = ParseCmdLine( line )
【引数】
CmdLine
返り値
コマンドライン
引数にアクセスするオブジェクト
サンプル
サンプルデータ
sample.exe param1 "param 2"
次のように分割されます
sample.exe
param1
param 2
未対応
現在のスクリプトを起動したときのコマンドラインではない、コマンドラインの内容に
アクセスしやすくします。
←
▼
▲
取得
メンバー
に準拠
未対応
←
▼
▲
Function GetWScriptArgumentsUnnamed() as array of string
コマンドラインの引数
を返します。 (改良版)
ソース
\' → "
\\' → \'
\\\' → \"
\\\\' → \\'
\ → \
\\ → \\
\\\ → \\\
\others → \others
\\others → \\others
\\\others → \\\others
参考
VBScript WSH を起動するコマンドラインの引数にダブルクォーテーションを含めることはできませんが、
本関数によるエスケープ文字の処理をすることで引数にダブルクォーテーションを含めることができ、
また、/ から始まる引数の両端のダブルクォーテーションは削除されます。 詳細は下記。
コマンドライン(vbslib を使うスクリプトを呼び出すコマンドライン)の中に、1文字以上の \ 文字と
それに続く ' 文字(シングルクォーテーション)があると、" に変換された引数が返ります。
コマンドラインから vbslib が受け取るパラメーターに " や \' を含めたいときは、\' や \\' のように
下記の逆変換をした文字列をコマンドラインに指定します。
変換のサンプルを以下に示します。 vbslib 独自の書き方ですが、コマンドラインの \ 文字とそれに
続く " 文字による処理とほぼ同じで、\ に続く文字だけが異なります。
→ T_CmdLine.vbs
テスト
T_GetWScriptArgumentsUnnamed
→ vbslib.vbs
"/a" → /a の変換の詳細 (ダブル クォーテーションの削除)
\' → " の変換をした後が、"/ から始まると、両端の " がなくなった引数が返ります。 また、
"\ から始まる引数は、" から始まるようになります。 "\ の変換は、"/ から始まっても両端の " を
なくさない引数を返せるようにするためです。 変換のサンプルを以下に示します。
サンプル
cscript sample.vbs \'quoted\' \'/directory\' /option "http://www.example.com"
\'/a\' → "/a" → /a
\'a\' → "a" → "a"
\'\/a\' → "\/a" → "/a"
\'\\a\' → "\\a" → "\a"
\'\\\a\' → "\\\a" → "\\a"
\'\\\\a\' → "\\\\a" → "\\\a"
\'\xa\' → "\xa" → "xa"
\'\\'\' → "\'" → "'"
\'\\\'\' → "\"" → """
\'\\\\'\' → "\\'" → "\'"
\'\\\\\'\'→ "\\"" → "\""
\'\\/a\' → "\\/a" → "\/a"
t\'/a\' → t"/a" → t"/a"
t/a → t/a → t/a
\'/a → "/a → /a
\a → \a → \a
/a → (返らない)
左記の A → B → C は、
A. コマンドラインの引数
B. \' → " の変換後(内部)
C. GetWScriptArgumentsUnnamed 関数の返り値
コマンドラインに特殊な書き方をすることで、/ から始まる POSIX 形式のパスや、名前付き引数
(オプション)を、名前なし引数として(オプションと分けて)受け取ることができます。
\'\\'\' → "\'" → "'"
\'/ や、\'\\ から始まるときは、"/a" → /a の変換を参照
Set args = GetWScriptArgumentsUnnamed()
Assert args.Count = 3
Assert args(0) = """quoted"""
Assert args(1) = "/directory"
Assert args(2) = "http://www.example.com"
コマンドライン:
VBScript :
\' → "
基本的な変換例:
詳細な変換例:
基本的な変換例:
\'/a\' → "/a" → /a
詳細な変換例:
逆変換の仕方
… " を \' に置き換える
… ' の前の \ を2倍の数の \ に置き換える
… " の前の \ を2倍の数の \ に、" を \' に置き換える
… ' の前の \ を2倍の数の \ に置き換える