日付の操作

日付の操作をするなら現在時刻を取得することが始まりだろう。
それにはNOW()関数を使用する。
この関数は現在の日付と時刻をバリアント型の値で返す。

サンプル
 Wscript Echo now()

結果
 2009/07/21 21:03:42

※NOW()はコンピュータのシステムの日付と時刻の設定に基づいて出力される。


次に用途だが、NOW()関数を使用するのはファイル名、セルの値、テキストに出力、
そしてある日付との比較が主だろう。

注意したいのがファイル名の場合だ。
ファイル名には"/"や":"を使用できないからである。
その場合は、Replace(Replace(now(),"/",""),":","")でファイル名に適合するよう数値のみの状態へ編集したらいい。


Replace

VBS クラス(CLASS)の使用



CLASSに定義した情報を呼び出す場合は、生成したオブジェクト名.(変数名やメソッド名)で呼び出します。

'クラスを定義します。
CLASS SAMPLE

    Private Fso

    Private Sub Class_Initialize
        Set Fso    = CreateObject("Scripting.FileSystemObject")
    End Sub

    Public Function FOpenWrite(strFilePath,objFile)

        On Error Resume Next
        Select Case Fso.FileExists(strFilePath)
        Case True
                Set objFile = Fso.OpenTextFile(strFilePath, ForWriting)
                Set FOpenWrite = Err.Number
        Case False
            Wscript.Echo "This File Not Exists"
            Set FOpenWrite = -1
    End Select

        On Error Goto 0

    End Function

    Public Function FClose(objFile)
        On Error Resume Next
        objFile.Close
        Set FClose = Err.Number
        On Error Goto 0
    End Function

    Private Sub Class_Terminate
        Set Fso    = Nothing
    End Sub

END CLASS

'ここから処理

Dim objFSO
Dim objWFile

'クラスを生成
Set clsFSO = New SAMPLE

'ファイルを開く
IF 0 = clsFSO.FOpenWrite("c:\temp\sample.txt",objWFile) Then

    '処理をする

    'ファイルを閉じる
    clsFso.FClose objFile
End If

'クラスを初期化
Set clsFSO = Nothing

REPALACE 改行コードの変換


<ソース>

ec "■改行コードの変換1"
Dim strData
strData = "-------------------"
strData = strData & vbcrlf
strData = strData & "-------------------"

ec "実行前のデータ"
ec strData
ec "実行後のデータ"
ec replace(strData,Vbcrlf,"")

ec "■改行コードの変換2"
strData = "-------------------"
strData = strData & chr(10) & chr(13)
strData = strData & "-------------------"

ec "実行前のデータ"
ec strData
ec "実行後のデータ"
ec replace(strData,chr(10)&chr(13),"")


Sub ec(strmsg)
   
Wscript.Echo "[" & Date & " " & time & "]" & strmsg

End Sub


<実行結果>




'[2009/03/14 15:57:06]■改行コードの変換1
'[2009/03/14 15:57:06]実行前のデータ
'[2009/03/14 15:57:06]-------------------
-------------------
'[2009/03/14 15:57:06]実行後のデータ
'[2009/03/14 15:57:06]--------------------------------------
'[2009/03/14 15:57:06]■改行コードの変換2
'[2009/03/14 15:57:06]実行前のデータ
'[2009/03/14 15:57:06]-------------------
-------------------
'[2009/03/14 15:57:06]実行後のデータ
'[2009/03/14 15:57:06]--------------------------------------

正規表現:エラーや処理効率について

<VBスクリプトの正規表現で注意すること>

 ()でデータを取得する場合は、"()()()()()()()()()"と極端 に何個も作らないこと。処理効率が下がります。それよりは、単純な正規表現で取得した値をループして取得する。


→正規表現TOP


<その他情報>

IPアドレスを取得する
Matchオブジェクトのプロパティ一覧

VBS Replace(データ、検索、置換、開始位置、置換個数、比較モード)

<記述形式>


Variant(String) = Replace(Expression, Find, replacewith[, start[, count[, compare]]])

Expression
  検索データ
Find
  検索キーワード
replacewith
  置換キーワード
start
  開始する位置。データに対して何文字目から検索するか指定する際に使用する。
  返される値も開始する位置からのデータからになる。
count
 置換する個数。省略すると一致した全ての候補を置換する。
compare
 検索モード(テキスト/バイナリ)。省略時はバイナリモード
     1  テキスト(vbTextCompare)
     0  バイナリ(vbBinaryCompare)

<ソース>


ec "□通常"
ec replace("1-2-1","1","2")
ec "□検索開始位置を指定"
ec replace("1-2-1","1","2",5)
ec "■対象なし"
ec replace("!-----!","A","C")
ec "■検索開始位置を指定"
ec replace("!-----!","A","C",2)

'メッセージ表示用
Sub ec(msg)
    Wscript.Echo "[" & Date & " " & time & "]" & msg
End Sub

<結果>


'[2009/02/22 14:44:10]□通常
'[2009/02/22 14:44:10]2-2-2
'[2009/02/22 14:44:10]□検索開始位置を指定
'[2009/02/22 14:44:10]2
'[2009/02/22 14:44:10]■対象なし
'[2009/02/22 14:44:10]!-----!
'[2009/02/22 14:44:10]■検索開始位置を指定
'[2009/02/22 14:44:10]-----!

<その他>


改行を変換する

IPアドレスを取得する(正規表現)

'______________________________________________
'
'<<IPアドレス情報の取得>>
' □機能
'  IPCONFIGの標準出力からIPアドレスの値を取得する
' □リターン
'  正常終了  : 取得件数
'  異常終了  : -1
'______________________________________________

Option Explicit

'変数定義
Dim strIP            'IPCONFIGの結果が設定
Dim aryIP            'IPアドレスが設定
Dim IPcnt            '取得件数
Dim idx              'インデックス

'IPCONFIGの結果(標準出力)を取得
If 0 <> Fnc_GetIP(strIP) Then
    Wscript.Quit(-1)
End If

'IPアドレスを取得
Select Case Cnt_GetIPAdress(strIP, aryIP)

    Case -1

        Wscript.Quit(-1)

    Case 0

        Wscript.Quit(0)

    Case Else

        IPcnt = Ubound(aryIP)
        Wscript.Echo "[Info]" & IPcnt & "件のIPAdressを取得しました"
        For idx = 1 to IPcnt
            Wscript.Echo "IP Adress : " & aryIP(idx)
        Next

        Wscript.Quit(IPcnt)

End Select

'□□□□□□□□□□□□□□□□□□□□
'IPCONFIG取得
'□□□□□□□□□□□□□□□□□□□□
'Ipconfigの標準出力を取得します
Private Function Fnc_GetIP(strIP)

    On Error Resume Next

    '<引数>
    'StrIp      : Out : Ipconfigの標準出力を設定
    '<復帰値>
    '正常終了   : 0
    '異常終了   : -1

    Dim objShell         'SHELLオブジェクト
    Dim objExec          'EXECオブジェクト

    Set objShell  = CreateObject("Wscript.Shell")
    'IPCONFIGコマンド発行
    Set objExec   = objShell.Exec("cmd.exe /c ipconfig")
    Select Case Err.Number
        Case 0

            '標準出力を取得
            With objExec.StdOut
                Do Until .AtEndOfStream
                    strIP = strIP & .ReadLine & VbCrLf
                Loop
            End With

            Fnc_GetIP = 0

        Case Else

            Wscript.Echo "[Info]ipconfigのコマンド実行でエラーが返されました"
            Wscript.Echo Err.Description & "(" & Err.Number & ")"

            Fnc_GetIP = -1

    End Select

    Set objShell = Nothing
    Set objExec  = Nothing

    On Error Goto 0

End Function

'□□□□□□□□□□□□□□□□□□□□
'IPアドレス(XXX.XXX.XXX.XXX)取得
'□□□□□□□□□□□□□□□□□□□□
'検索するデータから「IP Address....: (IPアドレス)」を
'検索して「(IPアドレス)」を取得する
Private Function Cnt_GetIPAdress(strIP,aryIP)

    On Error Resume Next

    '<引数>
    'strIp      : IN  : 検索データ
    'aryIP      : OUT : IPアドレス ※配列1より設定
    '<復帰値>
    '異常終了   : -1
    '対象なし   : 0
    '対象あり   : n(件数が設定)

    Dim objRegExp        'RegExpオブジェクト用
    Dim objMatchs        'RegExpオブジェクト用
    Dim cnt              'カウント
    Dim idx              'インデックス

    Set  objRegExp = New RegExp
    With objRegExp

        '検索パターンを設定
        .Pattern    = "IP Address(?:[^:]+): ([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})$"
        .Global     = True
        .IgnoreCase = True
        .MultiLine  = True

        '検索開始&結果を設定
        Set objMatchs = .Execute(strIP)
        Select Case Err.Number
            Case 0

                cnt = objMatchs.Count
                Redim AryIP(cnt)
                For idx = 1 To cnt
                    AryIP(idx) = objMatchs(idx-1).SubMatches(0)
                Next

                Cnt_GetIPAdress = cnt

            Case Else

                Wscript.Echo "[Info]Executeメソッドの実行でエラーが返されました"
                Wscript.Echo Err.Description & "(" & Err.Number & ")"

                Cnt_GetIPAdress = -1

        End Select

    End With

    Set objRegExp   = Nothing
    Set objMatchs   = Nothing

    On Error Goto 0

End Function

VBS RegExp-Matchオブジェクト

MATCHオブジェクトは正規表現/REGEXPの検索で一致した内容を参照するためのオブジェクトです。このオブジェクトはRegExpのEXECUTEメソッドの実行結果を受け取ると一致した個数のオブジェクトを作成します。REGEXPの検索結果の値にアクセスするためのオブジェクトです。一致した情報へアクセスするにはobjMatch(0)、objMatch(1)のようにオブジェクトへ添え字を指定して取得します。

<定義>
Set objMatch = RegExp.Execute(検索文字)

<プロパティ>
・FirstIndex
 検索文字の一致した位置を返します。
・Length
 検索文字の一致した位置列の長さを返します。
・Value
  検索文字の一致した内容を返します。

<サンプルソース>
'**********検索情報************
Const conPattern  = "\[開始\].*\[終了\]"
Const conTarget   = "---[開始]200901010....0001[終了]---"
'******************************

Dim objRegExp
Dim objMatch

Set objRegExp        = New RegExp
objRegExp.Pattern    = conPattern
Set objMatch         = objRegExp.Execute(conTarget)

'取得値表示
ec "[検索文字]" & conPattern
ec "[検索情報]" & conTarget

With objMatch(0)
    ec "[FirstIndex]" & .FirstIndex
    ec "[Length]" & .Length
    ec "[Value]" & .Value
End With

'メッセージ表示用
Sub ec(msg)
    Wscript.Echo "[" & Date & " " & time & "]" & msg
End Sub

'結果

'[2009/01/11 13:57:36][検索文字]\[開始\].*\[終了\]
'[2009/01/11 13:57:36][検索情報]---[開始]200901010....0001[終了]---
'[2009/01/11 13:57:36][FirstIndex]3
'[2009/01/11 13:57:36][Length]25
'[2009/01/11 13:57:36][Value][開始]200901010....0001[終了]

<その他参考情報>

正規表現の検索
正規表現で使用するメタ文字