「マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
目次 †
概要 †
トピック情報を纏めています。
- 言語構文やプログラミングの解説は、ここでは割愛します。
- 下記のガイドや、「vbs|vbscript やりたいこと」でググるなどしてください。
豊富なサンプル、Q&Aが、ネット上に多数転がっています。
- ネット上に転がっていたスクリプトを引用する際は、
権利関係に注意ください。(特に、まるまる引用するような場合)
VBScript と VBAの機能差 †
- VBScript は、 Excel VBA に似ています。
- Excel の モジュールシート に記述する感じで記述できます。
- ただ、構文や機能に、できることの違いが少しあります。
- リファレンスの「VBScript ユーザーズ ガイド」から、
- 「VBScript の機能で VBA に含まれていない機能」
- 「VBA の機能で VBScript に含まれていない機能」
を参照してください。
vbs と wsf †
VBScriptファイルは、vbs と wsf の 2種類あり、
どちらも WSH のスクリプトを記述します。
.vbsファイル †
.wsfファイル †
- *.wsf は xmlファイルで、 VBScriptのほか
- jscript
- 参照する TypeLib?
- 参照する(取り込む)scriptファイル
も記述することができます。
- wsfファイルは、ここでは解説しません、下を参照ください。
Windows スクリプト ファイル (.wsf) を使用する
VBScriptの勘所 †
以下、個別に。
set と let †
VBScriptで値を代入するときは、let 文を使います。
ただし、代入するものが object の場合は、 set 文を使います。
let str1 = "abcde"
str2 = "ABCDE"
set fso = CreateObject("Scripting.FileSystemObject")
普通は、let は 省略して、上の str2 の代入の様に書きます。
上の関数の戻り値(function) の場合も、同じです。
戻り値を返す関数の場合は、 関数名へ set を使って代入します。
filename = "c:\temp\tempfile.txt"
set fso = CreateObject("Scripting.FileSystemObject")
set tmp1 = makeTempFile(filename)
tmp1.writeline "てすと"
tmp1.close
set tmp1 = nothing
function makeTempFile(fn)
dim f
set f = fso.OpenTextFile(fn, 2, True) ' 2=書き込み, True=作成
set makeTempFile = f
end function
sub と function †
上の例の様に、sub ... end sub は、 値を返さない関数を定義します。
値を返す場合は、 function を使います。
function amari(a, b)
amari = ( a mod b )
end function
print amari( 20, 3 )
Function の戻り値 †
- 関数名 と同じ変数へ代入します。
- 関数の戻り値の型は指定できません。
(vbやvbaにある function funcname(arg1, arg2) as type」 の as type は記述できません)
上の例にある「a mod b」 は、 a を b で割った剰余を求める演算子です。
Functionの呼び出しは、 †
- 値を必要とする場所(代入の右辺、別の関数の引数、式の途中) などに、「関数名(引数,..)」の様に記述して呼び出します。
- また、値を必要としない場所では、「関数名 引数,..」の様に ( ) をつけずに記述します。
- 値を必要としない場所に ( ) をつけて記述する場合は、「call 関数名(引数,..)」の様にして戻り値を無視するようにします。
Subの呼び出しは、 †
- 「call 関数名(引数,..)」「関数名(引数,..)」「関数名 引数,..」どの形式でも使用できます。
変数の定義 †
Dim と スコープ †
- VBScriptでは、dim文で変数を定義します。
- スコープ
- 関数の外で定義すると、グローバル変数になります。
- class の中で定義することで、classのローカル変数にすることもできます。
- sub または function の中で定義した変数は、その関数の中がスコープになります。
Option Explicit †
- VBScriptは、dim文を省略することもできますが、
変数のはじめに現れた場所に依存して、スコープが関数内またはグローバルに決定されます。
- 変数名の誤字によるバグを回避したり、変数のスコープを管理するためにも、
VBScriptファイルの最初に「Option Explicit」を記述して、
未定義の変数をエラーとして検出するようにしましょう。
Private †
dim文のほかに、 定数を定義する const や、 class を作成した際に
class外部から参照させないための private もあります。
変数の型 †
なお、VBScript では、変数の型がありません。
dim var1 as string
の様に 「as 型」 を書くとエラーになります。
VBScript では、
- 全てが variant型で、代入した値や変数によって、型が変化します。
- また、数値型や文字列型とは自動で変換されます。
- 後述の様に、object型とその他を明確に区別したい場合は、その型の値を代入します。
Empty と Null と Nothing †
区別 †
Empty と Null と Nothingを区別するには、
isempty(変数名)
isnull(変数名)
isobject(変数名)
変数名 is nothing
を使います。
Empty †
Empty, Nullを代入 †
nullやemptyを代入することも出来ます。
str1 = null
str1 = empty
オブジェクトを代入 †
値とオブジェクト †
- 関数を定義する際、戻り値がある場合は、戻り値の型が、
値かオブジェクトかで、呼び出し元での 代入文が変わりますので、
どちらを返すのか決めて設計しましょう。
- 関数への引数では、値とオブジェクトのどちらでも受け入れる場合は、
isobject の真偽を確認して場合わけをします。
下は、配列へ1つ追加する関数の例です。
function add(dims, e)
Redim Preserve dims( ubound(dims) +1 )
if isobject(e) then
set dims( ubound(dims) ) = e
else
dims( ubound(dims) ) = e
end if
end function
dim arr
arr = array() ' 要素0個の配列
add arr, "123" ' 文字列を追加
add arr, fso ' オブジェクトを追加
- 実際に、値とオブジェクトを混在する配列は使用しないかもしれませんが
(扱いづらいですし)、こんな感じで両対応の関数を作ることが出来ます。
数値と数字 †
- 数値と数字は、使用する場所によって、
数値だったり文字列だったりします。
- できるだけ、意識して使い分けましょう。
変換 †
- cint() は 16bit整数に変換
- clng() は 32bit整数に変換
- int() は intに切り捨て。
文字と文字列 †
記述 †
文字列連結 †
「&」は文字列を連結する演算子です。
数値や数字は文字列に変換して連結します。
文字列であることが自明な場合は 「+」でも文字列連結が出来ます。
Mid †
- mid は 文字列の一部を返します。 C# や perl の substring に似ています。
- mid(文字列,開始位置,長さ) で、 開始位置は0が1文字目です。
「"」自身を文字列中では "" として記述します。
文字コード †
- chr() は 指定した文字コードが1文字の、長さ1の文字列を返します。
- chr(0) は C++ では \0 で文字列の終了ですが、~VBScript は 文字列は長さで管理していて、\0 も 文字列中に含めることが出来ます。
If文 †
Then †
- if 文は、 then の右に 処理を1つ書くか、 then の下の行に 処理を複数行書きます。
- then の右に書いたときは、 end if は省略できます。
- then の下に書いたときは、 elseif か else で続けて、 end if で閉じます。
str4 = "これはどんな文字列かな"
if mid(str4,3,1) = "ど" then print "「ど」があるね"
if instr(str4,"文字") >= len(str4)/2 then
print "後半に ""文字"" がある"
end if
式の評価順 †
継続行 と コメント †
VBScriptでは、 「 _」で次の行へ継続( _ の前にスペースあり)、「'」 があると行末まで無視します。
str1 = "あいうえお"
str2 = mid (str1, _
instr(str1, "う") -1 ) ' "う" 以後の文字列を取り出す
instrは、文字列を含む位置を返します(1~、含まないなら0)。
mid は 文字目が 0 なので、 instrの戻り値-1 の場所を指定することで、
「含むならその文字以後、含まないなら、全体」という文字列の取り出し方ができます。
ファイル操作 †
ファイル操作は、Scripting.FileSystemObject? を使用します。
const ForReading = 1
set fso = CreateObject("Scripting.FileSystemObject")
set ts = fso.OpenTextFile("c:\temp\tempfile.txt", ForReading)
print ts.readall
ts.close
set ts = nothing
set fso = nothing
- Scripting.FileSystemObject? によるファイル操作は、テキストファイルのみ動作します。
- 文字コードは Windows既定, Unicode を指定できますが、 UTF-8の様な文字コードは扱えません。
- バイナリデータも、chr(10) の様に文字コードを指定した文字列として扱うことは可能ですが、ファイル入出力時に、
改行コードやBOM文字、EOF文字が処理されて、期待するバイナリファイルにならないことがあります。
エラー処理 †
エラーの種類 †
- エラーは、
- 自分で値チェックなどで検出する論理エラーのほか、
- WSHその他が発生させるランタイムエラーがあり、
エラー発生後の処理 †
- ランタイムエラーが発生すると、WSHそのものがエラー終了します。
- COMなどのオブジェクト呼び出しの先でエラーが発生した場合も、ランタイムエラーになります。
- ランタイムエラーをVBScript内で処理するには、on error を使います。
- on error goto 0 (VBScriptをエラー終了する)
debug方法 †
VBScriptのデバッグは、
- debug用print文を埋め込み
- Visual Studio などの開発ツール
- Debugger
cscript.exe で実行するときに //x をオプションに指定して実行すると、
debugger が起動して、ステップ実行、 変数の確認 などができます。
- Microsoft Script Debugger
- Microsoft Script Editor
wscript.echo と wscript.stdout.writeline †
wscript.echo †
wscript.echo は、引数の文字列を、標準出力(cscript時) または 画面(wscript時) に出力します。
wscript.echo "これはスクリプト。"
for i = 0 to 9
wscript.echo "カウント " & i
next
wscript.quit 0
画面の場合は、 wscript.echo 1つにつき メッセージボックスが1つ表示され、 [OK] を押すのを待ちます。
wscript.stdout.writeline †
wscript.stdout.writeline は 引数の文字列を、標準出力に出力します。
cscript.exe でのみ動きます。 wscript.exe ではエラーになります。
wscript.stdout.writeline "これはスクリプト。"
for i = 0 to 9
wscript.stdout.writeline "カウント " & i
next
wscript.quit 0
スクリプトで作り込む際には、下の様に、 print 関数を定義する、などするといいでしょう。
sub print(v)
wscript.stdout.writeline v
end sub
参考 †
リファレンス †
関数、ステートメント †
- 関数(mid, cint, len, split, など)、
- ステートメント(dim, if, for, call, function, など) など、
- 言語のリファレンスは、以下を参照。
VBScript ランゲージ リファレンス
wscript, wshshell などの WSHのオブジェクトは、以下を参照。
ファイル操作 †
Scripting.FileSystemObject? などの ファイル操作関連のオブジェクトは、以下を参照。
ガイド、サンプル †
- VBScriptのプログラミングは、下のユーザーズガイドから、必要なトピックを参照ください。
- MS の Script Center では、豊富なサンプル例が検索できます。
左の選択肢から、用途や種類を絞り込んで、スクリプトの具体例が参照できます。
@IT †
Windows Server Insider 基礎解説 †
http://www.atmarkit.co.jp/fwin2k/tutor/index/index.html
Windows Server Insider 運用 †
http://www.atmarkit.co.jp/fwin2k/operation/indexpage/index.html#psh
- Windows管理者のためのWindows Script Host入門
Tags: :シェル, :インフラストラクチャ, :Windows, :Visual Basic, :移行