[ADSI プログラミング デバッグ] やっぱり VBScript がいい !! という方へ – 1

こんにちは、ILM 一家のパパ(お父さん)です。

前回、自称癒し系とお話しましたが、お母さん(ういこさん) と息子(ぴろと) に言わせると、私はイヤラシ系だそうです。たった一字違うだけなのに、非常に残念な言われようで、ホントに失礼な人たちです。

2/14 はバレンタインデーでしたね、私は前日にお母さん(ういこさん) から、チョコレートとスコーンをいただきました。 もう、朝からうれしくて良い一日でした、本当にありがとうお母さん(ういこさん)。最高に美味しかったよ。
それに、昨年は、近所のガキンチョに手作りチョコを渡しながら、父親の私には買ったものを渡した娘(実子)も、今年はチョコを手作り(以下写真)してくれました。 しかし、ホント昨年はへこみました。

 

   Chocolate1

でも、文字 は ”おしごとがんばってね” じゃなくて “ぱぱ だいいすき” でよかったのに…

お母さん(ういこさん) に言わせれば、”仕事しすぎ” らしいですけど、 “もっと仕事してね” と感じてしまうのは、去年のトラウマが原因でしょう。

さて、今回は、2/9 の掲載させていただいた、VBScript での動作トレース、デバッグ手法としてご紹介した、以下手法ついて、具合的なスクリプト例、実行操作をご紹介したいと思います。


1. プログラム実行位置、変数値などの確認情報を Echo 出力する。

2. プログラム実行位置、変数値などの確認情報を FileSystemObject 等でログファイル出力する。

それぞれ、標準出力、ファイル出力の差がありますが、CScript.exe を使用してコマンドプロンプトでスクリプト実行した場合、標準出力をファイルリダイレクトする事が可能なため、結果として両方の実装で、実行状況を出力ファイルにて確認する事が可能となります。

なお、スクリプトファイルをダブルクリックで実行するような場合、WScript.exe が使用されるため、ファイル出力には FileSystemObject を使って、スクリプトから直接ファイル出力する必要があります。

では、実際にそれぞれの手法を、2/9 の VBScript コードの拡張例として見ていただきましょう。

1. プログラム実行位置、変数値などの確認情報を Echo 出力する。

以下スクリプトはエラー発生時に情報を Echo 出力します。

Echo 出力内容 は Cscript.exe からの起動時には標準出力に、Wscript.exe からの起動時にはメッセージダイアログで表示されます。

 

コマンドプロンプトを開き、以下のようにスクリプトファイルを起動すれば、標準出力内容がテキストファイルにリダイレクトされます。

 

Ø CScript.exe xxxxxx.vbs > errlog.txt

' スクリプトセンター: パスワードの最終設定時の判別

' https://www.microsoft.com/japan/technet/scriptcenter/scripts/ad/users/pwds/uspwvb09.mspx

' ---------------------------------------------------------------

' エラー発生時、エラーメッセージ表示せず次行へ処理を進める

On Error Resume Next

ErrLine = 1: Err.Clear

Set objUser = GetObject _

("LDAP://CN=ILM_Papa, OU=Users,DC=microsoft,DC=com")

If Err.Number <> 0 then ErrSub

ErrLine = 2: Err.Clear

dtmValue = objUser.PasswordLastChanged

If Err.Number <> 0 then ErrSub

WScript.echo "pwdLastSet is: " & dtmValue

' エラー発生時、エラー行と、エラー番号を出力する

Sub ErrSub()

WScript.Echo("Line - " & ErrLine & " : Error Code - " & Err.Number)

End Sub

'---------------------------------------------------------------


2. プログラム実行位置、変数値などの確認情報を FileSystemObject 等でログファイル出力する。

以下のコードは、エラー発生時に情報をテキストファイル出力します。

直接ファイル出力する実装のため、スクリプト起動操作に依存せず状態をファイル出力可能です。

' スクリプトセンター: パスワードの最終設定時の判別

' https://www.microsoft.com/japan/technet/scriptcenter/scripts/ad/users/pwds/uspwvb09.mspx

' ---------------------------------------------------------------

' FileSystemObject で出力ファイルをオープンする

Const ForAppending = 2

Set objFSO = CreateObject("Scripting.FileSystemObject") ' FileSystemObject 作成

Set objTextFile = objFSO.OpenTextFile("Errlog.txt", ForAppending, True) ' FileOpen

'エラー発生時、エラーメッセージ表示せず次行へ処理を進める

On Error Resume Next

ErrLine = 1: Err.Clear

Set objUser = GetObject _

("LDAP://CN=ILM_Papa, OU=Users,DC=microsoft,DC=com")

If Err.Number <> 0 then ErrSub

ErrLine = 2: Err.Clear

dtmValue = objUser.PasswordLastChanged

If Err.Number <> 0 then ErrSub

WScript.echo "pwdLastSet is: " & dtmValue

objTextFile.Close ' FileClose

'エラー発生時、エラー行と、エラー番号を出力する

Sub ErrSub()

objTextFile.WriteLine("Line - " & ErrLine & " : Error Code - " & Err.Number)

End Sub

'---------------------------------------------------------------

いかがでしょうか、以上のような手法を用いることで、動作状況や、必要に応じて変数値などをファイルに出力いただけます。VBScript が予期しない動作をするような場合、実行動作をファイルに記録したい場合の手法として、参考になれば幸いです。

~ お父さんより ~

 

ILMBlog0214.jpg