「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。 -戻る --[[Visual Basic]] --[[スクリプティング]] * 目次 [#v289a47b] #contents * 概要 [#ka786e28] トピック情報を纏めています。 -言語構文やプログラミングの解説は、ここでは割愛します。 -下記のガイドや、「vbs|vbscript やりたいこと」でググるなどしてください。~ 豊富なサンプル、Q&Aが、ネット上に多数転がっています。 -ネット上に転がっていたスクリプトを引用する際は、~ 権利関係に注意ください。(特に、まるまる引用するような場合)~ **VBScript と VBAの機能差 [#we00d8bf] -VBScript は、 [[Excel VBA]] に似ています。 --Excel の モジュールシート に記述する感じで記述できます。 --ただ、構文や機能に、できることの違いが少しあります。 -[[リファレンス>#t9a0541e]]の「VBScript ユーザーズ ガイド」から、 --「VBScript の機能で VBA に含まれていない機能」 --「VBA の機能で VBScript に含まれていない機能」 >を参照してください。 **vbs と wsf [#b112b8c1] VBScriptファイルは、vbs と wsf の 2種類あり、~ どちらも [[WSH]] のスクリプトを記述します。~ ***.vbsファイル [#ic2f1837] -*.vbs は VBScriptのみを記述。 ***.wsfファイル [#ja94a2bf] -*.wsf は xmlファイルで、 VBScriptのほか --jscript --参照する TypeLib --参照する(取り込む)scriptファイル >も記述することができます。 -wsfファイルは、ここでは解説しません、下を参照ください。 >[[Windows スクリプト ファイル (.wsf) を使用する:http://msdn.microsoft.com/ja-jp/library/cc392507.aspx]]~ * VBScriptの勘所 [#p946e3c9] 以下、個別に。 **set と let [#d8814c27] 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 [#o479093e] 上の例の様に、sub ... end sub は、 値を返さない関数を定義します。~ 値を返す場合は、 function を使います。~ function amari(a, b) amari = ( a mod b ) end function print amari( 20, 3 ) ***Function の戻り値 [#q0ad8578] -関数名 と同じ変数へ代入します。 -関数の戻り値の型は指定できません。~ (vbやvbaにある function funcname(arg1, arg2) as type」 の as type は記述できません)~ 上の例にある「a mod b」 は、 a を b で割った剰余を求める演算子です。~ ***Functionの呼び出しは、 [#w9b2dedb] -値を必要とする場所(代入の右辺、別の関数の引数、式の途中) などに、「関数名(引数,..)」の様に記述して呼び出します。 -また、値を必要としない場所では、「関数名 引数,..」の様に ( ) をつけずに記述します。 -値を必要としない場所に ( ) をつけて記述する場合は、「call 関数名(引数,..)」の様にして戻り値を無視するようにします。 ***Subの呼び出しは、 [#s3f84f0b] -「call 関数名(引数,..)」「関数名(引数,..)」「関数名 引数,..」どの形式でも使用できます。~ **変数の定義 [#nf5bc6bb] ***Dim と スコープ [#n6e2d3a8] -VBScriptでは、dim文で変数を定義します。 -スコープ --関数の外で定義すると、グローバル変数になります。 --class の中で定義することで、classのローカル変数にすることもできます。 --sub または function の中で定義した変数は、その関数の中がスコープになります。 ***Option Explicit [#e88964e8] -VBScriptは、dim文を省略することもできますが、~ 変数のはじめに現れた場所に依存して、スコープが関数内またはグローバルに決定されます。 -変数名の誤字によるバグを回避したり、変数のスコープを管理するためにも、~ VBScriptファイルの最初に「Option Explicit」を記述して、~ 未定義の変数をエラーとして検出するようにしましょう。~ ***Private [#g103b0db] dim文のほかに、 定数を定義する const や、 class を作成した際に~ class外部から参照させないための private もあります。~ ***変数の型 [#if71f326] なお、VBScript では、変数の型がありません。 dim var1 as string の様に 「as 型」 を書くとエラーになります。 VBScript では、 -全てが variant型で、代入した値や変数によって、型が変化します。 -また、数値型や文字列型とは自動で変換されます。 -後述の様に、object型とその他を明確に区別したい場合は、その型の値を代入します。 **Empty と Null と Nothing [#y78ba177] ***区別 [#m0388235] Empty と Null と Nothingを区別するには、 isempty(変数名) isnull(変数名) isobject(変数名) 変数名 is nothing を使います。 ***Empty [#g9395f5b] -変数の初期状態は empty です。 dim str1 if isempty(str1) then print "str1 is empty" end if -なにか代入するとその値の型になります。 -型の名前は TypeName 関数で取得できます。 str1 = 123 if NOT isempty(str1) then print "str1 is not empty. is " & typename(str1) end if ***Empty, Nullを代入 [#s33865a6] nullやemptyを代入することも出来ます。 str1 = null str1 = empty ***オブジェクトを代入 [#c4293b4f] -オブジェクトを代入すると、オブジェクト型になります。 set fso = CreateObject("Scripting.FileSystemObject") if isobject(fso) then print "is object" end if -nothing も オブジェクトの一種です。 set obj1 = nothing if isobject(obj1) then print "is object" end if if obj1 is nothing then print "is nothing" end if ***値とオブジェクト [#ie0f9506] -関数を定義する際、戻り値がある場合は、戻り値の型が、~ 値かオブジェクトかで、呼び出し元での 代入文が変わりますので、~ どちらを返すのか決めて設計しましょう。 -関数への引数では、値とオブジェクトのどちらでも受け入れる場合は、~ 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 ' オブジェクトを追加 -実際に、値とオブジェクトを混在する配列は使用しないかもしれませんが~ (扱いづらいですし)、こんな感じで両対応の関数を作ることが出来ます。~ **数値と数字 [#j4947e96] -数値と数字は、使用する場所によって、~ 数値だったり文字列だったりします。 -できるだけ、意識して使い分けましょう。 ***変換 [#q9195503] -cint() は 16bit整数に変換 -clng() は 32bit整数に変換 -int() は intに切り捨て。 ***例 [#x76392af] -int2 には 45 (45.6を切捨て)が入ります。 -int3 には 46 (45.6を四捨五入)が入ります。 -int4 には 579、 str4 には "456123" が入ります。 str1 = "456" int1 = cint(str1) long1 = clng(str1) int2 = int(int1/10) int3 = cint(int1/10) int4 = str1 + 123 str4 = str1 + "123" **文字と文字列 [#r294f8b6] ***記述 [#ta97b31c] -文字も文字列も " " で囲んで記述します。 str1 = "123456" str2 = mid(str1,3,1) str3 = """123""と""456""" ***文字列連結 [#t9183984] 「&」は文字列を連結する演算子です。~ 数値や数字は文字列に変換して連結します。~ 文字列であることが自明な場合は 「+」でも文字列連結が出来ます。 ***Mid [#m77ce98e] -mid は 文字列の一部を返します。 C# や perl の substring に似ています。 -mid(文字列,開始位置,長さ) で、 開始位置は0が1文字目です。~ 「"」自身を文字列中では "" として記述します。 ***文字コード [#t46874ba] -VBScript 内部では、文字列はunicodeで表現されているので、半角/全角の区別はありません。 -VBScript には、 文字列と文字の区別はありません。 長さ1の文字列で代用します。 str2 = chr(9) str3 = "これは\0で区切っています" & chr(0) & "続きもある" -chr() は 指定した文字コードが1文字の、長さ1の文字列を返します。 -chr(0) は C++ では \0 で文字列の終了ですが、~VBScript は 文字列は長さで管理していて、\0 も 文字列中に含めることが出来ます。~ **If文 [#t28303d7] ***Then [#rcf0de90] -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 ***式の評価順 [#w2b46def] -VBScript の if文は、式を全て評価してから、if文全体の真偽を判定します。~ set obj = func1() if (NOT obj is nothing) and obj.flag = 2 then ' foo end if -この例の場合、~ obj が オブジェクトであっても、なくても、.flag を参照するので、~ obj が オブジェクトでなかった場合に、エラーになります。~ 下の様に、if文をネストさせて、式の評価順に依存しないようにします。~ if NOT obj is nothing then if obj.flag = 2 then ' foo end if end if ** 継続行 と コメント [#v8d18065] VBScriptでは、 「 _」で次の行へ継続( _ の前にスペースあり)、「'」 があると行末まで無視します。~ str1 = "あいうえお" str2 = mid (str1, _ instr(str1, "う") -1 ) ' "う" 以後の文字列を取り出す instrは、文字列を含む位置を返します(1~、含まないなら0)。~ mid は 文字目が 0 なので、 instrの戻り値-1 の場所を指定することで、~ 「含むならその文字以後、含まないなら、全体」という文字列の取り出し方ができます。~ **ファイル操作 [#jd476827] ファイル操作は、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文字が処理されて、期待するバイナリファイルにならないことがあります。 ** エラー処理 [#eb69591e] ***エラーの種類 [#r8a57296] -エラーは、 --自分で値チェックなどで検出する論理エラーのほか、 --[[WSH]]その他が発生させるランタイムエラーがあり、 ***エラー発生後の処理 [#v57189ef] -ランタイムエラーが発生すると、[[WSH]]そのものがエラー終了します。 -COMなどのオブジェクト呼び出しの先でエラーが発生した場合も、ランタイムエラーになります。 -ランタイムエラーをVBScript内で処理するには、on error を使います。 --on error goto 0 (VBScriptをエラー終了する) --on error resume next (無視して続行、Err変数にエラー番号が設定される)~ ランタイムエラーを処理するには、on error resume next を使用して、~ ランタイムエラー時に VBScriptが設定する Err変数 を参照してエラー判定をします。 err1 = 0 ' エラー番号 on error resume next 'ランタイムエラーでVBScriptを終了させない Err.Clear 'Err変数をクリア set obj1 = CreateObject("hogehoge.hogehoge1") if Err.Number <> 0 then err1 = Err.Number 'ランタイムエラー判定 if err1 = 0 then if obj1.hagehage("てすと") <> 0 then err1 = 1 ' 論理エラー end if end if if err1 <> 0 then print "エラー発生 " & err1 end if wscript.quit err1 ' エラー番号 を VBScriptの終了コードに ** debug方法 [#ba96bc99] VBScriptのデバッグは、 -debug用print文を埋め込み -Visual Studio などの開発ツール -Debugger~ cscript.exe で実行するときに //x をオプションに指定して実行すると、~ debugger が起動して、ステップ実行、 変数の確認 などができます。 --Microsoft Script Debugger --Microsoft Script Editor **wscript.echo と wscript.stdout.writeline [#e8ac313b] ***wscript.echo [#vb800945] 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 [#e0c9b5ee] 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 *参考 [#acfcf81e] -VBScript - Wikipedia~ https://ja.wikipedia.org/wiki/VBScript **リファレンス [#t9a0541e] ***関数、ステートメント [#g37f5669] -関数(mid, cint, len, split, など)、 -ステートメント(dim, if, for, call, function, など) など、 -言語のリファレンスは、以下を参照。 >[[VBScript ランゲージ リファレンス:http://msdn.microsoft.com/ja-jp/library/cc392193]]~ ***[[WSH]]オブジェクト [#xd04d1f3] wscript, wshshell などの [[WSH]]のオブジェクトは、以下を参照。 -[[Windows Script Host の基礎:http://msdn.microsoft.com/ja-jp/library/cc392526]] -[[Windows Script Host のオブジェクト モデル:http://msdn.microsoft.com/ja-jp/library/cc392522]] ***ファイル操作 [#qc08fcb4] Scripting.FileSystemObject などの ファイル操作関連のオブジェクトは、以下を参照。 -[[FileSystemObject オブジェクト:http://msdn.microsoft.com/ja-jp/library/cc428071.aspx]] -[[FileSystemObject のプログラミング:http://msdn.microsoft.com/ja-jp/library/cc392177.aspx]] ***ガイド、サンプル [#v0fa79b1] -VBScriptのプログラミングは、下のユーザーズガイドから、必要なトピックを参照ください。~ --[[VBScript ユーザーズ ガイド:http://msdn.microsoft.com/ja-jp/library/cc392209]]~ -MS の Script Center では、豊富なサンプル例が検索できます。~ 左の選択肢から、用途や種類を絞り込んで、スクリプトの具体例が参照できます。 --[[Script Center:http://gallery.technet.microsoft.com/scriptcenter/]] **@IT [#t48a5ee2] ***Windows Server Insider 基礎解説 [#n3f2d36f] http://www.atmarkit.co.jp/fwin2k/tutor/index/index.html -チェック式WSH入門(全19回) --第1回 WSHを始めよう~ http://www.atmarkit.co.jp/fwin2k/tutor/cformwsh01/cformwsh01_01.html --第2回 VBScriptの基本を押さえよう(その1)~ http://www.atmarkit.co.jp/fwin2k/tutor/cformwsh02/cformwsh02_01.html --第3回 VBScriptの基本を押さえよう(その2)~ http://www.atmarkit.co.jp/fwin2k/tutor/cformwsh03/cformwsh03_01.html --第4回 関数を使いこなす(その1)~ http://www.atmarkit.co.jp/fwin2k/tutor/cformwsh04/cformwsh04_01.html --第5回 データ型について理解を深めよう~ http://www.atmarkit.co.jp/fwin2k/tutor/cformwsh05/cformwsh05_01.html --第6回 VBScriptの配列を極める~ http://www.atmarkit.co.jp/fwin2k/tutor/cformwsh06/cformwsh06_01.html --第7回 Subプロシージャでユーザー独自の処理を定義する~ http://www.atmarkit.co.jp/fwin2k/tutor/cformwsh07/cformwsh07_01.html --第8回 Functionプロシージャでユーザー独自の関数を定義する~ http://www.atmarkit.co.jp/fwin2k/tutor/cformwsh08/cformwsh08_01.html --第9回 VBScriptのオブジェクトを使いこなす~ http://www.atmarkit.co.jp/fwin2k/tutor/cformwsh09/cformwsh09_01.html --第10回 WScriptオブジェクトを利用する(1)~ http://www.atmarkit.co.jp/fwin2k/tutor/cformwsh10/cformwsh10_01.html --第11回 WScriptオブジェクトを利用する(2)~ http://www.atmarkit.co.jp/fwin2k/tutor/cformwsh11/cformwsh11_01.html --第12回 WshShellオブジェクトを利用する(1)~ http://www.atmarkit.co.jp/fwin2k/tutor/cformwsh12/cformwsh12_01.html --第13回 WshShellオブジェクトを利用する(2)~ http://www.atmarkit.co.jp/fwin2k/tutor/cformwsh13/cformwsh13_01.html --第14回 WshShellオブジェクトを利用する(3)~ http://www.atmarkit.co.jp/fwin2k/tutor/cformwsh14/cformwsh14_01.html --第15回 WshNetworkオブジェクトを利用する~ http://www.atmarkit.co.jp/fwin2k/tutor/cformwsh15/cformwsh15_01.html --第16回 FileSystemObjectオブジェクトを利用する(1)~ http://www.atmarkit.co.jp/fwin2k/tutor/cformwsh16/cformwsh16_01.html --第17回 FileSystemObjectオブジェクトを利用する(2)~ http://www.atmarkit.co.jp/fwin2k/tutor/cformwsh17/cformwsh17_01.html --第18回 FileSystemObjectオブジェクトを利用する(3)~ http://www.atmarkit.co.jp/fwin2k/tutor/cformwsh18/cformwsh18_01.html --第19回 TextStreamオブジェクトとDictionaryオブジェクトを使う~ http://www.atmarkit.co.jp/fwin2k/tutor/cformwsh19/cformwsh19_01.html ***Windows Server Insider 運用 [#eee7e1cc] http://www.atmarkit.co.jp/fwin2k/operation/indexpage/index.html#psh -Windows管理者のためのWindows Script Host入門 --第1回 WSHの内部構造~ http://www.atmarkit.co.jp/fwin2k/operation/wsh01/wsh01_01.html --第2回 WSHスクリプト・コーディングの第1歩~ http://www.atmarkit.co.jp/fwin2k/operation/wsh02/wsh02_01.html --第3回 WScriptオブジェクトの詳細(1)~ http://www.atmarkit.co.jp/fwin2k/operation/wsh03/wsh03_01.html --第4回 WScriptオブジェクトの詳細(2)~ http://www.atmarkit.co.jp/fwin2k/operation/wsh04/wsh04_01.html --第5回 WshShellオブジェクトの詳細(1)~ http://www.atmarkit.co.jp/fwin2k/operation/wsh05/wsh05_01.html --第6回 WshShellオブジェクトの詳細(2)~ http://www.atmarkit.co.jp/fwin2k/operation/wsh06/wsh06_01.html --第7回 WshShellオブジェクトの詳細(3)~ http://www.atmarkit.co.jp/fwin2k/operation/wsh07/wsh07_01.html --第8回 WshNetworkオブジェクトの詳細~ http://www.atmarkit.co.jp/fwin2k/operation/wsh08/wsh08_01.html --第9回 WshControllerオブジェクトの詳細~ http://www.atmarkit.co.jp/fwin2k/operation/wsh09/wsh09_01.html --第10回 WSHスクリプトからのファイル操作(1)~ http://www.atmarkit.co.jp/fwin2k/operation/wsh10/wsh10_01.html --第11回 WSHスクリプトからのファイル操作(2)~ http://www.atmarkit.co.jp/fwin2k/operation/wsh11/wsh11_01.html ---- Tags: [[:シェル]], [[:インフラストラクチャ]], [[:Windows]], [[:Visual Basic]] Tags: [[:シェル]], [[:インフラストラクチャ]], [[:Windows]], [[:Visual Basic]], [[:移行]]