2011年6月26日日曜日

CmdLibのプロパティ

プロパティ名
ScriptingHost

概要
実行するスクリプトアプリケーション

詳細
実行するスクリプトアプリケーションを参照・指定することができます。
初期値は、WScriptです。

CmdLibのメソッド

メソッド
validateDateTime

概要
WMIで認識できる日付型文字列のチェック

構文
validateDateTime(strDateTime)

パラメータ
strDateTime...文字列
詳細:
strDateTimeに指定した文字列が、WMIで認識できる日付型として妥当かどうかをチェックします。
妥当であればTrue、そうでなければFalseを返します。

メソッド
changeToWMIDateTime

概要
WMIで認識できる日付型文字列に整形

構文
changeToWMIDateTime(strDateTime, strTimeZone)

パラメータ
strDateTime...日付型文字列
strTimeZone...タイムゾーン

詳細
strDateTimeに指定した日付型文字列を、WMIで認識できる日付型に整形して返します。
strTimeZoneに指定した文字列は、整形した日付型文字列の最後尾に付加されます。

メソッド
matchPattern

概要
正規表現によるパターンチェックを行う

構文
strMatchPattern(strMatchPattern, strPhrase)

パラメータ
strMatchPattern...正規表現パターン
strPhrase...文字列

詳細
strMatchPatternに指定した正規表現パターンに、strPhraseに指定した文字列が合致しているかどうかをチェックします。
合致した場合は、合致した件数を返します。何も合致しない場合は、0を返します。

メソッド
vbPrintf

概要
パラメータ付きのメッセージを表示

構文
vbPrintf(strPhrase, args)

パラメータ
strPhrase...表示するメッセージ(%1, %2, ...の形式でメッセージにパラメータを指定可能)
args...strPhraseにパラメータを指定した場合、そのパラメータの値

詳細
strPhraseには、表示するメッセージを指定します。
%1, %2, %3, ...のようにパラメータを指定することができます。
strPharaseにパラメータを指定した場合、そのパラメータに渡す値を配列で指定します。

メソッド
getPassword

概要
パスワードを表示

構文
getPassword()

詳細:※
使い方がわからない。
getPassword()メソッドを実行すると、「パスワードを入力してください」のメッセージが表示される。
InputBoxではなくメッセージボックスのため、パスワードを入力することができない。
また、「OK」ボタンしかない。
「OK」ボタンをクリックすると、「処理しています…」のメッセージボックスが表示される。
このメッセージボックスも、「OK」ボタンしかクリックすることができない。
戻り値も空。

メソッド
wmiConnect

概要
WMIに接続する

構文
wmiConnect(strNameSpace, strUserName, strPassword, strServer, blnLocalConnection, objService)

パラメータ
strNameSpace...名前空間
strUserName...ユーザー名
strPassword...パスワード
strServer...ホスト名
blnLocalConnection...ローカル接続ならTrue、そうでなければFalse(参照渡し)
objService...サービスのインスタンス(参照渡し)

詳細
指定した条件でWMIに接続し、成功したらTrue、失敗したらFalseを返します。
strNameSpaceには、接続するWMIの名前空間を指定します。
strUserNameに接続するユーザー名、strPasswordに接続ユーザーのパスワード、strServerに接続するホスト名を指定します。
blnLocalConnectionには、ローカル接続であればTrue、そうでなければFalseを指定します。
指定したユーザー名、パスワード、ホスト名でWMIに接続できない場合、ローカルマシンであれば現在の接続ユーザー情報で再接続を試みます。
この時点でWMIに接続できた場合、blnLocalConnectionは必ずTrueを返します。
objServiceは、接続に成功した場合はサービスのインスタンスを返します。

メソッド
getHostName

概要
ホスト名を返す

構文
getHostName(ObjService)

パラメータ
ObjService...サービスのインスタンス

詳細
ObjServiceに指定したサービスからホスト名を返します。
ホスト名を取得できなかった場合は、文字列"N/A"を返します。

メソッド
getUserName

概要
ユーザー名を返す

構文
getUserName(ObjService)

パラメータ
ObjService...サービスのインスタンス

詳細
ObjServiceに指定したサービスからユーザー名を返します。
ユーザー名を取得できなかった場合は、文字列"N/A"を返します。

メソッド
getDomainName

概要
ドメイン名を返す

構文
getDomainName(ObjeService)

パラメータ
ObjService...サービスのインスタンス

詳細
ObjServiceに指定したサービスからドメイン名を返します。
ドメイン名を取得できなかった場合は、文字列"N/A"を返します。

メソッド
getArguments

概要
パラメータに指定した配列とインデックスから該当する値を返す

構文
getArguments(StrVarName, strVar, intArglter, blnAllowNegativeValues)

パラメータ
StrVarName...エラーメッセージに出力するパラメータ(表示したい配列のフィールド名など)
strVar...指定したインデックスの値(参照渡し)
intArglter...配列のインデックス(参照渡し)
blnAllowNegativeValues...数値チェックを行う場合は、True、そうでなければFalseを指定

詳細
StrVarNameは、指定した内容にエラーがあった場合、エラーメッセージに付加する文字列を指定します。
たとえば、表示したい配列のフィールド名などを指定します。
strVarには、指定したインデックスに存在した値を返します。
intArglterには、配列のインデックスを指定します。
blnAllowNegativeValuesには、数値チェックを行う場合はTrue、数値チェックを行わない場合はFalseを指定します。
指定した条件より配列から値を取得できた場合はTrue、指定した条件に誤りがあった場合はFalseを返します。

うまく動かない。
エラーメッセージは表示されないものの、戻り値はFalseとなる。

メソッド
checkScript

概要
実行されているスクリプトの種類を返す

構文
checkScript()

詳細
実行されているスクリプトの種類を返します。
cscriptなら2を、それ以外なら0を返します。

メソッド
LengthinBytes

概要
指定した文字列のバイト数を返す

構文
LengthinBytes(strString)

パラメータ
strString...文字列

概要
strStringには、バイト数を調査する文字列を指定します。

メソッド
trapError

概要
エラーメッセージを表示する

構文
trapError(strIn)

パラメータ
strIn...任意の文字列

詳細
エラーが発生している場合、エラーに該当するメッセージを表示して戻り値にTrueを返します。
エラーが発生していない場合は、戻り値にFalseを返します。
strInには、呼び出し元のメソッド名などの任意の文字列を指定します。

メソッド
packString

概要
文字列に空白を付加する

構文
packString(strString, intWidth)

パラメータ
strString...文字列
intWidth...バイト数

詳細
strStringに指定した文字列に対し、intWidthに指定したバイト数に達するまで空白を付加します。
strStringに指定した文字列がすでにintWidthに指定したバイト数以上の場合、そのバイト数までの文字列をカットします。

メソッド
getMaxStringLen

概要
配列の中から最も長い文字列のバイト数を返す

構文
getMaxStringLen(arrStrings)

構文
getMaxStringLen(arrStrings)

パラメータ
arrStrings...文字列型配列

詳細
arrStringsに指定した文字列型配列のなかから最も長い文字列を検索し、そのバイト数を返します。

メソッド
showResults

概要
2次元配列の内容を指定したフォーマットで返す

構文
showResults(arrHeader, arrResultsArray, arrMaxLength, strFormat, blnPrintHeader, arrBinHide)

パラメータ
arrHeader...配列(ヘッダー)
arrResultsArray...配列(データ)
arrMaxLength...配列の最大長
strFormat...出力形式("LIST", "CSV", "TABLE")
blnPrintHeader...ヘッダー表示有無
arrBinHide...0以外を指定したインデックスは非表示にする

詳細
arrHeaderには、配列のヘッダーを指定します。
arrResultsArrayには、内容を表示したい2次元配列を指定します。
arrMaxLengthには、各配列の表示時の最大長を指定します。
strFormatには、出力形式を指定します。
指定できる出力形式は、"LIST", "CSV", "TABLE"の3パターンです。
それぞれの出力サンプルは、次のとおりです。

LISTの場合
コード: 100
名前: テスト1
日付: 2010/10/01

コード: 200
名前: テスト2
日付: 2010/10/02

コード: 300
名前: テスト3
日付: 2010/10/03

CSVの場合
"コード","名前","日付"
"100","テスト1","2010/10/01"
"200","テスト2","2010/10/02"
"300","テスト3","2010/10/03"

TABLEの場合
コード 名前 日付
----------- ----------- -----------
100 テスト1 2010/10/01
200 テスト2 2010/10/02
300 テスト3 2010/10/03

blnPrintHeaderには、ヘッダーを表示するかしないかを指定します。
ヘッダーを表示する場合はTrue、表示しない場合はFalseを指定します。
フォーマットが"CSV"もしくは"TABLE"にした場合のみ、効果があります。
arrBlnHideにて、0以外を指定したインデックスは非表示となります。

2011年6月2日木曜日

Microsoft.CmdLibについて

Microsoft.CmdLib
    対象OS…WindowsXP

    概要…VBS Library

    パス…C:\WINDOWS\system32\cmdlib.wsc

    全メソッド…
        checkScript
        vbPrintf
        getHostName
        getUserName
        getDomainName
        LengthinBytes
        getPassword
        trapError
        getArguments
        wmiConnect
        packString
        getMaxStringLen
        showResults
        validateDateTime
        changeToWMIDateTime
        matchPattern

    全プロパティ…
        ScriptingHost

    その他…
        拡張子(.wsc)。Windows Script Componentの略。
        実体は、XMLファイル。UTF-8形式で保存されている。

2011年5月29日日曜日

リモートマシンで共有ファイルを開かせる

このシステムのしくみ


サーバーにてExcSnd.vbsを実行すると、ExcSnd.vbsのプログラム上でリモートマシンに接続し、サーバー上のファイルを開かせる。
このサンプルでは、サーバー上にあるExcSnd.exeという音を出すファイルをリモートマシン上で実行させるためのVBScript。
サーバー上で実行するのは、Facade.vbs。
Facade.vbsより、メインのExcSnd.vbsを実行する。
Facade.vbsでは、他にもいくつかの共通モジュールを使用している。
それらの共通モジュールは、いかちソフトウェアVBScriptサイトから入手できる。

ExcSnd.vbs
  1. Option Excplicit
  2. '==============================
  3. ' 定数定義
  4. '==============================
  5. 'サーバー名
  6. 'TODO:サーバー名を指定
  7. Const SERVER_NAME = "[サーバー名]"
  8. '共有フォルダ名
  9. '※ExcSnd.exeは、VBSモジュールと同一のフォルダに格納し、共有フォルダに設定
  10. Const SHARED_PATH = "TEST\source\ExcSnd\"
  11. '対象マシン一覧ファイル
  12. Const TARGET_MACHINE_FILE = ".\tgtfnlst.csv"
  13. '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  14. ' 警告音を出すためのクラス
  15. '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  16. Class ExcSnd
  17.     '==============================
  18.     ' 変数定義
  19.     '==============================
  20.     'メッセージ
  21.     Private mstrMessage
  22.     '==============================
  23.     ' プロパティ
  24.     '==============================
  25.     'メッセージ
  26.     Public Property Get Message()
  27.         Message = mstrMessage
  28.     End Property
  29.     Private Property Let Message(ByVal vstrMsg)
  30.         mstrMessage = vstrMsg
  31.     End Property
  32.     '********************************************************************************
  33.     ' メソッド名:PlaySound
  34.     ' 概要   :警告音を出す(Windows XP Exclamation.wav)
  35.     ' パラメータ:なし
  36.     ' 戻り値  :正常実行ならTrue、そうでなければFalse
  37.     '********************************************************************************
  38.     Public Function PlaySound()
  39.         PlaySound = False
  40.         '対象マシンの一覧を読み込み
  41.         Dim varMachine
  42.         If ReadMachineList(varMachine) = False Then
  43.             Exit Function
  44.         End If
  45.         '対象マシンの警告音を出す
  46.         If UBound(varMachine) > 0 Then
  47.             If PlaySoundPersonal(varMachine) = False Then
  48.                 Exit Function
  49.             End If
  50.         End If
  51.         PlaySound = True
  52.     End Function
  53.     '********************************************************************************
  54.     ' メソッド名:ReadMachineList
  55.     ' 概要   :警告音を出す対象となるマシンの一覧を読み込む
  56.     ' パラメータ:[rvarMachine] - 対象マシン一覧
  57.     ' 戻り値  :正常に読み込めたらTrue、そうでなければFalse
  58.     '********************************************************************************
  59.     Private Function ReadMachineList(ByRef rvarMachine)
  60.         ReadMachineList = False
  61.         Dim objTfm
  62.         Set objTfm = New TextFileManager
  63.         Dim strBuf
  64.         strBuf = objTfm.ReadText(TARGET_MACHINE_FILE)
  65.         rvarMachine = Split(strBuf, vbCrLf)
  66.         ReadMachineList = True
  67.     End Function
  68.     '********************************************************************************
  69.     ' メソッド名:PlaySoundPersonal
  70.     ' 概要   :マシン個別に警告音を出す
  71.     ' パラメータ:[rvarMachine] - 対象マシン一覧
  72.     ' 戻り値  :正常に音声出力できたらTrue、そうでなければFalse
  73.     '********************************************************************************
  74.     Private Function PlaySoundPersonal(ByRef rvarMachine)
  75.         PlaySoundPersonal = False
  76.         On Error Resume Next
  77.         Dim i
  78.         For i = 0 To UBound(rvarMachine)
  79.             If rvarMachine(i) = "" Then
  80.                 Exit For
  81.             End If
  82.             Dim objWMIService
  83.             Set objWMIService = GetObject("winmgmts:\\" & rvarMachine(i) & "\root\cimv2:Win32_Process")
  84.             Dim intProcessID
  85. 'TODO:管理者ユーザーIDと管理者ユーザーパスワードの指定
  86.             Call objWMIService.Create("net use \\" & SERVER_NAME & "\C$ /user:" & SERVER_NAME & "\[管理者ログインID] [管理者ログインパスワード]", Null, Null, intProcessID)
  87.             '※音がなったりならなかったりと不安定のため
  88.             WScript.Sleep 3000
  89.             Call objWMIService.Create("\\" & SERVER_NAME & SHARED_PATH & "excsnd.exe", Null, Null, intProcessID)
  90.             '※音がなったりならなかったりと不安定のため
  91.             WScript.Sleep 3000
  92.             Call objWMIService.Create("net use \\" & SERVER_NAME & "\C$ /delete", Null, Null, intProcessID)
  93.             Set objWMIService = Nothing
  94.             If (Err.Number <> 0) Then
  95.                 Message = CStr(Err.Number) & ":" & Err.Desciption
  96.                 Exit Function
  97.             End If
  98.         Next
  99.         On Error GoTo 0
  100.         PlaySoundPersonal = True
  101.     End Function
  102. End Class

Facade.vbs

  1. '※このプログラムを実行するには、管理者権限が必要です
  2. Option Explicit
  3. Dim fso
  4. Set fso = CreateObject("Scripting.FileSystemObject")
  5. Function Include(ByVal fileName)
  6.     Include = fso.OpenTextFile(fileName, 1, False).ReadAll()
  7. End Function
  8. Execute Include(".\ExcSnd.vbs")
  9. Execute Include("..\..\common\FileCommon.vbs")
  10. Execute Include("..\..\common\TextFileManager.vbs")
  11. Execute Include("..\..\common\LogFile.vbs")
  12. '********************************************************************************
  13. ' 関数名:Main
  14. ' 概要 :警告音再生
  15. ' 引数 :なし
  16. ' 戻り値:なし
  17. '********************************************************************************
  18. Sub Main()
  19.     Dim startTime
  20.     startTime = Now()
  21.     Dim es
  22.     Set es = New ExcSnd
  23.     Dim bRet
  24.     bRet = es.PlaySound()
  25.     If (bRet = False) Then
  26.         Call WriteLog(startTime, es.Message)
  27.     End If
  28.     Set es = Nothing
  29. End Sub
  30. '********************************************************************************
  31. ' 関数名:WriteLog
  32. ' 概要 :エラーログを出力する
  33. ' 引数 :[startTime] - 実行開始
  34. '     [msg] - メインクラスからのメッセージ
  35. ' 戻り値:なし
  36. '********************************************************************************
  37. Sub WriteLog(ByVal startTime, ByVal msg)
  38.     Const LOGFILE_PATH = "L:\警告音再生エラーログ.log"
  39.     Dim fc
  40.     Set fc = New FileCommon
  41.     Call fc.FileDelete(LOGFILE_PATH)
  42.     Set fc = Nothing
  43.     Dim oLog
  44.     Set oLog = New LogFile
  45.     oLog.FileName = LOGFILE_PATH
  46.     Dim sLog
  47.     sLog = ""
  48.     sLog = sLog & "実行開始時間:" & CStr(startTime) & vbCrLf
  49.     sLog = sLog & "実行終了時間:" & CStr(Now()) & vbCrLf
  50.     sLog = sLog & vbCrLf
  51.     sLog = sLog & "警告音再生に失敗しました。" & vbCrLf
  52.     sLog = sLog & "エラーの詳細は、以下のとおりです。" & vbCrLf
  53.     sLog = sLog & vbCrLf
  54.     sLog = sLog & msg & vbCrLf
  55.     oLog.AddText sLog
  56.     Set oLog = Nothing
  57. End Sub

2011年5月27日金曜日

WSHにドラッグ&ドロップした場合のカレントディレクトリの取得について

VBScriptをドラッグ&ドロップにて実行した場合、以下の方法ではカレントディレクトリのパスが取れない。
  1. Option Explicit

  2. Dim objShell
  3. Set objShell = CreateObject("WScript.Shell")

  4. 'カレントディレクトリのパスを取得
  5. MsgBox objShell.CurrentDirectory

  6. Set objShell = Nothing
なぜか、


WindowsXPの場合:C:\Documents and Settings\[ユーザー名]
Windows7の場合:C:\Windows\System32


となってしまう。
VBScriptをどこにおいても、またドラッグ&ドロップするファイルが存在するパスに関係なく、このフォルダをカレントディレクトリと誤認する。
ただし、特殊フォルダのパスを取得することは可能。
  1. Option Explicit

  2. Dim objShell
  3. Set objShell = CreateObject("WScript.Shell")

  4. 'デスクトップのパスを取得
  5. MsgBox objShell.SpecialFolders("Desktop")

  6. Set objShell = Nothing