←
▼
→ VBA
→ VBScript ポケットリファレンス
→ WSH 2_0 (Web)
関連
Windows の標準的なスクリプトです。拡張子= (*.vbs)
Windows2000 以降ではデフォルトで入っています。
WSH (WScript.exe) が VBScript などのスクリプトを解析して実行します。
COM オブジェクトを通して、Windows や MS-Office を操作できます。
Windows Script Encoder で、バイナリ形式にすることもできます。
→ VisualBasic
参考
.vbs ファイルをダブルクリックしてから実行開始まで時間がかかるときは、ウィルス
対策ソフトのスクリプトに関するチェックをしないようにしてください。 チェックをしなく
ても、Windows のセキュリティ機能によって、ユーザーの許可無く悪意のあるスクリ
プトが実行されることはありません。
←
▼
▲
新規 VBS ファイルの作成
メモ帳を開いて、VBS を記述し、ファイルを保存するときにファイル名の最後に .vbs を
付けてください。
→ new_vbs
←
▼
▲
特殊記号一覧 (VBScript)
Sub
Function
Class
' comment
( )
.
new
Set
&
←
▼
▲
While cond
WEnd
Do
Exit Do
Loop
Do
Loop cond
For i=1 To 4 Step 2
Exit For
Next
If cond Then
...
ElseIf cond Then
...
Else
...
End If
Select Case value
Case value
Case 0, 1
Case 2 to 5
Case Else
End Select
For Each a In コレクション
Next
コレクション(0)
コレクション.Count
→ VB Script ポケットリファレンス p028
Do Until
Loop
continue は無い。GoTo も無い。
' コメント
If a = "" Then
If a <> "" Then
If a <= "" Then
If cond Then ...
WScript.Sleep( 1000 )
WScript.Quit
If cond Then ... : Else ...
If cond Then ... :_
Else ...
If cond Then
...
ElseIf cond Then ... : ElseIf cond Then ... Else ... End If
If UCase("abc") = UCase("AbC") Then
大文字小文字を区別しない比較
If cond1 and cond2 Then
For Each の中で Exit For しないで
ループから抜けたとき、a は Empty になります。
型判定
真 = 偽以外、 偽 = False or 0 or Empty or Null
If a Is b Then
同じオブジェクトかどうかを判定します。
参考
キーワード:
Until は偽の
ときにループ
For Each s In Array( "A", "B", "C )
←
▼
▲
main xx, 12
Sub main( x, ByVal y )
Exit Sub
End Sub
x = f( 0 )
Function f( x )
Set f = Nothing
End Function
引数は、参照渡し(call by reference) なので、関数内で x を変えると、関数から抜け
ても変わっています。
ByVal を付けると 値渡し(call by value) です。 ByRef を付けると参照渡しです。
f( , 1 )
引数の省略ができます。
省略した引数は、VarType( a ) = vbError になります。
ただし、VBS で定義した関数やメソッドは、最後の引数を省略できません。
引数の数が違うというエラーに、最後をコンマだけにすると構文エラーになります。
COM オブジェクトのメソッドは省略できます。
引数が1つのときは、Sub でも括弧付きで呼び出せてしまいますが、これは Sub の
第1パラメータに渡す前に評価している(+0のように効果の無い計算をしている)
ことになります。 このとき、評価後の値が渡るので、ByRef の引数であっても、
値渡しになり、関数内で引数の変数に設定した値を、呼び出し元が取得することが
できなくなります。
ByRef の引数に、オブジェクトのプロパティ (例:obj.prop)を渡すと、参照渡しには
なりません。 一度、単純変数を引数に指定して呼び出した後で、単純変数から、
プロパティに設定してください。
参照返し
引数で出力するときは、呼び出し側ですぐ分かるように、一旦 out 変数に入れる方法も
あります。out 変数から代入されたところから、s が変化した場所が分かります。
Dim s, out
GetString out
s = out
関連
FuncA Array( ,,2 )
FuncA "<PARAM param1='abc'/>"
VBS で定義した関数やメソッドに、任意の数の引数を取りたいときは、Array 関数や
XML を経由する方法があります。
参考
オプション的な引数(マイナーな引数)は、Option_ 引数にするとよいでしょう。
Option_ 引数は、通常の引数列の最後に加える引数です。(言語仕様ではなく応用です)
Option_ 引数は、通常 Empty を指定しますが、Integer 型(フラグ変数)やクラスなどを
使えばどんなパラメータも追加できます。 ちなみに Option は VBScript の予約語なので
Option_ にしています。
Sub FuncA( ParamA, ParamB, Option_ )
定義例:
使用例:
FuncA 1, 2, Empty
←
▼
▲
Option Explicit
Class ClassA : Public VarA : End Class
Dim obj, b
' Set obj = New ClassA
' obj.VarA = 1
b=( not IsEmpty( obj ) ) 'and
If b Then b=( obj.VarA = 1 )
If b Then
WScript.Echo "True"
Else
WScript.Echo "False"
End If
If not IsEmpty( obj ) and obj.VarA = 1 Then
C言語と異なり、and の両方は必ず実行されるため、
上記の文は obj が Empty のときに例外が発生します。
次のようにしてください。
b=( not IsEmpty( obj ) ) 'and
If b Then b=( obj.VarA = 1 )
If b Then
検証コード:
検証コード:
b=( IsEmpty( obj ) ) 'or
If not b Then b=( obj.VarA = 1 )
If b Then
C言語と異なり、or の両方は必ず実行されるため、
上記の文は obj が Empty のときに例外が発生します。
次のようにしてください。
If IsEmpty( obj ) or obj.VarA = 1 Then
Option Explicit
Class ClassA : Public VarA : End Class
Dim obj, b
' Set obj = New ClassA
' obj.VarA = 1
b=( IsEmpty( obj ) ) 'or
If not b Then b=( obj.VarA = 1 )
If b Then
WScript.Echo "True"
Else
WScript.Echo "False"
End If
×
×
obj.VarA = 1
obj.VarA = 1
IsEmpty( obj )
obj.VarA = 1
obj.VarA = 1
not IsEmpty( obj )
obj.VarA = 1
obj.VarA = 1
まずは、C言語のように and or を含む文を記述してから、下記のリンク先を
参照して対処してください。
VB では C言語と異なり、and や or の後の条件文を必ず実行します。
このために、前の条件文によって後の条件文でエラーになることがあります。
not IsEmpty( obj )
IsEmpty( obj )
IsEmpty( obj )
not IsEmpty( obj )
○
○
関連
←
▼
▲
Function GetRef( FuncName as string ) as Function or Sub
文字列で指定したシンボルのプロシージャを返します。
FuncName に指定したプロシージャが定義されていないときは、エラー 5 になります。
サンプル:
Dim sub_x
Set sub_x = GetRef( "sub1" )
sub_x '// sub1 を呼び出します
Sub sub1()
MsgBox "X"
End Sub
Dim sub_x
On Error Resume Next
Set sub_x = GetRef( "sub1" )
On Error Goto 0
If IsEmpty( sub_x ) Then MsgBox "Not defined"
MsgBox "err = " & Err.Number
Sub sub1
Err.Raise 1,,"Error in sub1"
End Sub
プロシージャが定義されているかどうかの判定
IsEmpty
1.
標準的なエラーメッセージを表示する
2.
エラーコードやエラーメッセージを Err オブジェクトに設定する
3.
IsEmpty が On Error Resume Next のように働き、次の行から実行する。
GetRef でプロシージャが取得できたかどうか(定義されているかどうか)は、
IsEmpty sub_x で判定することはできません。
エラー 5 が発生したかどうかで判定してください。
IsEmpty sub_x とすると、sub1 が定義されていなければ、期待通り "Not defined"
と表示しますが、sub1 が定義されていると、sub1 を呼び出してしまいます。
さらに、次のような特殊な動きになります。
悪いコード
Dim sub_x, en
On Error Resume Next
Set sub_x = GetRef( "sub1" )
en = Err.Number : On Error GoTo 0
If en = 5 Then MsgBox "Not defined"
MsgBox "err = " & Err.Number
Sub sub1
Err.Raise 1,,"Error in sub1"
End Sub
良いコード
返される値はオブジェクト参照ですが、同じ FuncName を指定しても、同じオブジェクト
への参照にはなりません。
GetRef で取得した関数は、ExecuteGlobal でオーバーライドしても、無くなりません。
Dim ref
ExecuteGlobal "Function F() : F=1 : End Function"
Set ref = GetRef( "F" )
echo "F, ref"
echo F() & ", " & ref()
ExecuteGlobal "Function F() : F=2 : End Function"
echo F() & ", " & ref()
出力内容
F, ref
1, 1
2, 1
If GetRef("sub1") Is GetRef("sub1") '// False
クラスの中のメソッドは指定できません。
引数が無い関数(例:上記 sub_x)は、下記コードでも呼び出してしまいます。
If IsEmpty( sub_x ) Then ...
ダミーの引数を定義してください。
←
▼
▲
VBSReference1
VBSReference2
Lesson1 もっとも簡単なプログラムを書いてみよう
Lesson2 プロパティ・メソッド・オブジェクトの意味を理解しよう
Lesson3 If文と式の評価について
Lesson4 For文と配列について
Lesson5 その他のフロー制御構文
Lesson6 サブルーチン-SubプロシージャとFunctionプロシージャ-
Lesson7 エラー処理の基礎
Lesson8 基礎編のまとめ
Lesson9 アプリの起動とレジストリ
WScriptのオブジェクト1 -WshShellオブジェクト-
Lesson10 ショートカットの作成
WshShellのオブジェクト1 -WshShortcutオブジェクト・WshUrlShortcutオブジェクト-
Lesson11 環境変数と特殊フォルダ
WshShellのオブジェクト2 -WshEnvironmentオブジェクト・WshSpecialFoldersオブジェクト-
Lesson12 ネットワークとコマンドラインオプション
WScriptのオブジェクト2 -WshNetworkオブジェクト・WshArgumentsオブジェクト-
Lesson13 ファイルシステムにアクセスする
FileSystemObjectのメソッド -FileSystemObjectオブジェクト-
Lesson14 ファイル・フォルダ・ドライブの操作
FileSystemObjectのオブジェクト1 -Folder,File,Driveオブジェクト・Folders,Files,Drivesコレクション-
Lesson15 テキストファイルを読み書きする
FileSystemObjectのオブジェクト2 -TextStreamオブジェクト-
Lesson15
←
▼
▲
WScript.Network オブジェクト
←
▼
▲
WScript.Echo [Arg1] [,Arg2] [,Arg3]
WScript.Sleep( msec )
WScript.Quit( quit_code=0 )
WScript.ScriptFullName
起動した VBScript ファイルの絶対パス。
include された VBScript ファイルでは、include した大元のファイルのパス。
WScript.Echo
WScript.ScriptName
VBS ファイル名+拡張子。 フォルダパスは含まれません。
下記のように、オブジェクト名を記述する必要があります。
グローバル以外のオブジェクトの Class_Terminate は呼ばれません。
vbslib では、Raise を使うことを推奨します。 vbslib を使わないときは、
Err.Raise に指定したエラー番号が、プロセスの返り値(エラーレベル)に
反映されませんが、vbslib を使うと反映されます。(参照:CallFinalizeInModules)
サンプル:
Stop : WScript.Quit 1
Quit する前にデバッガーで止まるようにするとよいでしょう。
←
▼
▲
Dim g_sh : Set g_sh = WScript.CreateObject("WScript.Shell")
オブジェクトの取得
←
▼
▲
Set g_sh = WScript.CreateObject("WScript.Shell")
oldDir = g_sh.CurrentDirectory
g_sh.CurrentDirectory = ".."
:
g_sh.CurrentDirectory = oldDir
カレントディレクトリ・プロパティ
Property Shell::CurrentDirectory as String
サンプル: 一度、親フォルダの絶対パスに設定し、戻す
カレントディレクトリにしようとするフォルダが存在しないときは、
エラー 0x80070002 が返ります。
Set g_sh = WScript.CreateObject("WScript.Shell")
g_sh.CurrentDirectory = g_fs.GetParentFolderName( Wscript.ScriptFullName )
サンプル: 現在の .vbs ファイルが入っているフォルダをカレントにする
プログラムの最初でこれをしないと、プログラム中の相対パスの基準は、コマンド
プロンプトのカレントディレクトリや、スクリプトを起動したプログラムのカレント
ディレクトリになります。
include される .vbs ファイルは、上記のようにしても、カレントディレクトリは
.vbs ファイルが入っているフォルダにはなりません。
include するスクリプトが include する前にカレントディレクトリを設定してください。
←
▼
▲
Function Shell::ExpandEnvironmentStrings( s as string ) as string
環境変数を展開します。
サンプル:
Dim g_sh : Set g_sh = WScript.CreateObject( "WScript.Shell" )
WScript.Echo g_sh.ExpandEnvironmentStrings( "%ProgramFiles%\MyProg" )
C:\Progarm Files\MyProg と出力されます。
指定した環境変数が定義されていないときは、% % で囲んだ部分もそのまま残ります。
g_sh.ExpandEnvironmentStrings( "%Unknown%\MyProg" ) = "%Unknown%\MyProg"
関連
←
▼
▲
Dim g_sh : Set g_sh = WScript.CreateObject( "WScript.Shell" )
Dim envs : Set envs = g_sh.Environment( "Process" )
WScript.Echo "PATH = " + envs.Item( "PATH" )
envs.Item( "TEMP2" ) = "temporary2"
WScript.Echo "TEMP2 = " + envs.Item( "TEMP2" ) '// "TEMP2 = temporary2" と表示
サンプル:
Function Shell::Environment( Place as string ) as WshEnvironment
環境変数のコレクションを返します。 コレクションから環境変数の設定もできます。
【引数】
Place
環境変数の存在場所。 通常 "Process"
返り値
Place 引数
参考
"Process", "System", "User", "Volatile" のいずれか
"Process" を指定すると、現在の WSH プロセスが持っている環境変数になります。
プロセス起動時の値は、 System と User を合わせたものです。
"System", "User" を指定した場合は、PC の設定を変えることになるので、取り扱いに
注意してください。 "User" は、Windows7 でも管理者権限である必要はありません。
環境変数のコレクション
For Each line In g_sh.Environment( "Process" )
WScript.Echo line
Next
サンプル:
←
▼
▲
特殊フォルダのパスを返します
Shell::SpecialFolders( name as string ) as string
name に指定できる値
→ 特殊フォルダ
関連
Dim g_sh : Set g_sh = WScript.CreateObject( "WScript.Shell" )
MsgBox g_sh.SpecialFolders( "Desktop" )
サンプル:
C:\Documents and Settings\(ユーザ名)\デスクトップ
出力例:
”NetHood”
”SendTo”
”StartMenu”
”Startup”
”Templates”
”Recent”
”Programs”
”PrintHood”
”MyDocuments”
”Fonts”
”Favorites”
”AllUsersStartup”
”AllUsersPrograms”
”AllUsersStartMenu”
←
▼
▲
Dim g_sh : Set g_sh = WScript.CreateObject( "WScript.Shell" )
Dim shcut : Set shcut = g_sh.CreateShortcut( g_sh.SpecialFolders( "SendTo" ) +_
"\file1.lnk" )
shcut.TargetPath = "C:\file1.txt"
shcut.Save
エクスプローラーの右クリック [ 送る ] に file1 を登録します。
file1.lnk
C:\file1.txt
送る、に登録する場合は、パラメーター %1 は不要です。