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