つづき
前回 にひきつづき、VBScriptによる自動化用のクラスまとめです。
ネットワーク関連
会社の業務自動化だと「認証の必要な共有フォルダからファイルを・・・」なんてこともあるので、ときどき使います。
NetworkUtilClass.vbs
Class NetworkUtilClass
' 変数宣言 -----------------------------------
Private NetworkObject
' コンストラクタ / デストラクタ --------------
Private Sub Class_Initialize()
Set NetworkObject = CreateObject("WScript.Network")
End Sub
Private Sub Class_Terminate()
Set NetworkObject = Nothing
End Sub
' ネットワーク関連 ---------------------------
Public Sub CreateNetworkDrive(drive,path,user,pass)
On Error Resume Next
NetworkObject.RemoveNetworkDrive path, True, False
NetworkObject.MapNetworkDrive drive, path, False, user, pass
End Sub
Public Sub RemoveNetworkDrive(path)
On Error Resume Next
NetworkObject.RemoveNetworkDrive path, True, False
Set NetworkObject = Nothing
End Sub
Public Sub StartAccessSharedFolder(path,user,pass)
On Error Resume Next
NetworkObject.RemoveNetworkDrive path, True, False
NetworkObject.MapNetworkDrive "", path, False, user, pass
End Sub
Public Sub EndAccessSharedFolder(path)
On Error Resume Next
NetworkObject.RemoveNetworkDrive path, True, False
End Sub
End Class
CSVに対してSQLを実行
DBからSQLでデータを取ってくるのは当たり前ですが、CSVからSQLで抽出できるのは意外と知らない人が多い?
(僕の周りだけでしょうか。。。)
クラス化するかは別として、知ってると便利です。
ExecSql4CsvClass.vbs
Class ExecSql4CsvClass
' 変数宣言 -----------------------------------
Private objWShell
Private objADO
Private csvFoloder
' コンストラクタ / デストラクタ --------------
Private Sub Class_Initialize()
Set objWShell = CreateObject("WScript.Shell")
Set objADO = CreateObject("ADODB.Connection")
End Sub
Private Sub Class_Terminate()
Set objADO = Nothing
Set objWShell = Nothing
End Sub
Public Default Property Get Constructor(arg1)
csvFoloder = arg1
objADO.Open "Driver={Microsoft Text Driver (*.txt; *.csv)};DBQ=" & csvFoloder & ";ReadOnly=1"
End Property
Public Function Execute(sql)
Set Execute = objADO.Execute(sql)
End Function
End Class
ファイル関連
業務の自動化だとよく使うかなと思うテキストファイルの読み書き。
文字コードは、S-JIS、UTF-8、UTF-8Nに対応しました。
ファイルの文字コード変換は横着してるので、そのままでもまぁ使えますが、可能なら修正して使ってください m(_ _;)m
FileUtilClass.vbs
Class FileUtilClass
' 定数宣言 -----------------------------------
Private Property Get READ()
READ = 1
End Property
Private Property Get WRITE()
WRITE = 2
End Property
' 変数宣言 -----------------------------------
Private fso
Private objFile
Private objWShell
Private charset
Private rw
Private filePath
' コンストラクタ / デストラクタ --------------
Private Sub Class_Initialize()
Set fso = WScript.CreateObject("Scripting.FileSystemObject")
Set objWShell = CreateObject("WScript.Shell")
filePath = ""
End Sub
Private Sub Class_Terminate()
Set fso = Nothing
Set objFile = Nothing
Set objWShell = Nothing
End Sub
' ファイルの読み書き *******************************************************
Private Function SetCharset(str)
Select Case str
Case "UTF8","UTF-8","U"
SetCharset = "UTF8"
Case "UTF8N","UTF-8N"
SetCharset = "UTF8N"
Case "SJIS","S-JIS","S"
SetCharset = "SJIS"
Case Else
SetCharset = "SJIS"
End Select
End Function
' ファイル読み込み -----------------------------------------------
Public Sub OpenReadFile(path,cs)
charset = SetCharset(cs)
filePath = path
rw = READ
Select Case charset
Case "UTF8","UTF8N"
Set objFile = CreateObject("ADODB.Stream")
' 1:バイナリ・2:テキスト
objFile.Type = 2
objFile.Charset = "UTF-8"
objFile.Open
objFile.LoadFromFile path
Case Else
Set objFile = objFso.OpenTextFile(path, 1, True)
End Select
End Sub
' ファイル書き出し(上書き) ---------------------------------------
Public Sub OpenWriteFile(path,cs)
charset = SetCharset(cs)
filePath = path
rw = WRITE
Select Case charset
Case "UTF8","UTF8N"
Set objFile = CreateObject("ADODB.Stream")
' 1:バイナリ・2:テキスト
objFile.Type = 2
objFile.Charset = "UTF-8"
objFile.Open
' ※メモリ上に書き出し->pathは保存時に指定
Case Else
Set objFile = objFso.OpenTextFile(path, 2, True)
End Select
End Sub
' ファイル書き出し(追記) -----------------------------------------
Public Sub OpenAppendFile(path,cs)
charset = SetCharset(cs)
filePath = path
rw = WRITE
Select Case charset
Case "UTF8","UTF8N"
Set objFile = CreateObject("ADODB.Stream")
'読み取り/書き込みモード
objFile.Mode = 3
' 1:バイナリ・2:テキスト
objFile.Type = 2
objFile.Charset = "UTF-8"
objFile.Open
objFile.LoadFromFile (filePath)
'ポインタを終端へ
objFile.Position = objFile.Size
Case Else
Set objFile = objFso.OpenTextFile(path, 8, True)
End Select
End Sub
' 1行読み込み ----------------------------------------------------
Public Function ReadLine
Select Case charset
Case "UTF8","UTF8N"
ReadLine = objFile.ReadText(-2)
Case Else
ReadLine = objFile.ReadLine
End Select
End Function
' 全行読み込み ---------------------------------------------------
Public Function ReadAll
Select Case charset
Case "UTF8","UTF8N"
ReadAll = objFile.ReadText(-1)
Case Else
ReadAll = objFile.ReadAll
End Select
End Function
' 書き込み -------------------------------------------------------
Public Sub WriteLine(str)
Select Case charset
Case "UTF8","UTF8N"
objFile.WriteText str, 1
Case Else
objFile.WriteLine str
End Select
End Sub
' 閉じる ---------------------------------------------------------
Public Sub Close
Select Case charset
Case "UTF8" ' BOM有り
If rw = WRITE Then
objFile.SaveToFile filePath, 1
End If
objFile.Close
Case "UTF8N" ' BOM無し
If rw = WRITE Then
objFile.Position = 0
'バイナリモードにする
objFile.Type = 1
' 先頭3バイト(BOM)をスキップする
objFile.Position = 3
' データを読み込む
Dim bin
bin = objFile.Read
objFile.Close
' 書き出し
Set objFile = CreateObject("ADODB.Stream")
' 1:バイナリ・2:テキスト
objFile.Type = 1
objFile.Open
objFile.Write(bin)
' 書き出しファイルの保存
objFile.SaveToFile filePath, 2
End If
objFile.Close
Case Else
objFile.Close
End Select
charset = ""
filePath = ""
rw = 0
End Sub
' EOF判定
Public Property Get EOF()
Select Case charset
Case "UTF8","UTF8N"
EOF = objFile.EOS
Case Else
EOF = objFile.AtEndOfStream
End Select
End Property
' ファイルの文字コード変換 *************************************************
' 文字コード変換(SJIS->UTF-8)
Public Sub ConvSjis2Utf8(path)
Dim objFr, objTo
' S-JIS
Set objFr = CreateObject("ADODB.Stream")
objFr.Charset = "Shift_JIS"
objFr.Open
objFr.LoadFromFile path
' UTF8
Set objTo = CreateObject("ADODB.Stream")
objTo.Type = 2
objTo.Charset = "UTF-8"
objTo.Open
' 変換
objFr.CopyTo objTo
' 保存
objTo.SaveTofile path , 2
' 後処理
objFr.Close
objTo.Close
Set objFr = Nothing
Set objTo = Nothing
End Sub
' 文字コード変換(UTF-8->UTF-8N)
Public Sub ConvUtf82Utf8n(path)
Dim objFr, objTo
Set objFr = CreateObject("ADODB.Stream")
objFr.Type = 1
objFr.Open
objFr.LoadFromFile path
Set objTo = CreateObject("ADODB.Stream")
objTo.Type = 1
objTo.Open
' 読み込み
objFr.Position = 0
' 先頭3バイト = BOM をスキップする
objFr.Position = 3
Dim bin
bin = objFr.Read
' 書き出し
objTo.Write(bin)
' 保存
objTo.SaveTofile path , 2
' 後処理
objFr.Close
objTo.Close
Set objFr = Nothing
Set objTo = Nothing
End Sub
' 文字コード変換(UTF-8N->SJIS)
Public Sub ConvUtf8n2Sjis(path)
Dim objFr, objTo
' S-JIS
Set objFr = CreateObject("ADODB.Stream")
objFr.Charset = "UTF-8"
objFr.Open
objFr.LoadFromFile path
' UTF8
Set objTo = CreateObject("ADODB.Stream")
objTo.Type = 2
objTo.Charset = "Shift_JIS"
objTo.Open
' 変換
objFr.CopyTo objTo
' 保存
objTo.SaveTofile path , 2
' 後処理
objFr.Close
objTo.Close
Set objFr = Nothing
Set objTo = Nothing
End Sub
' 文字コード変換(SJIS->UTF-8N)
Public Sub ConvSjis2Utf8n(path)
ConvSjis2Utf8 path
ConvUtf82Utf8n path
End Sub
' 文字コード変換(UTF-8->SJIS)
Public Sub ConvUtf82Sjis(path)
ConvUtf82Utf8n path
ConvUtf8n2Sjis path
End Sub
' 文字コード変換(UTF-8N->UTF-8)
Public Sub ConvUtf8n2Utf8(path)
ConvUtf8n2Sjis path
ConvSjis2Utf8 path
End Sub
End Class
呼び出しサンプル
ファイル配置は以下の通りです。
VBScripts
│ 99.mousepos.vbs
│
└─lib
IeUtilClass.vbs
KeyboardUtilClass.vbs
MouseUtilClass.vbs
NetworkUtilClass.vbs
ExecSql4CsvClass.vbs
FileUtilClass.vbs
前回 、コメントでアドバイスいただいたので、呼び出し側をWSFにしてみました。
ファイル読み込みの部分がスッキリして、こちらの方がよいですね。
99.mousepos.wsf
<job id="MouseUtilExample">
<COMMENT>
マウス操作自動化のサンプル
</COMMENT>
<script language="VBScript" src=".\lib\MouseUtilClass.vbs"/>
<object id="fso" progid="Scripting.FileSystemObject"/>
<script language="VBScript">
Option Explicit
Dim mouseUtil
Set mouseUtil = New MouseUtilClass
Dim pos
WScript.Echo "3"
WScript.Sleep(1000)
WScript.Echo "2"
WScript.Sleep(1000)
WScript.Echo "1"
WScript.Sleep(1000)
pos = mouseUtil.GetMousePos()
WScript.Echo pos(0) & " / " & pos(1)
WScript.Sleep(1000)
WScript.Echo "Move to "
WScript.Sleep(1000)
Call mouseUtil.MouseMove(pos(0)+100,pos(1)+100)
' 解放
Set mouseUtil = Nothing
'終了
WScript.Quit
</Script>
</job>
これだけあれば、業務の自動化はかなりできるのではないでしょうか。
(マウスクリックやSendkeysの入力による力業になる場合もありますが)
あと手持ちのネタは、
- IEの操作でXPathを使えるようにしてみた
- IEの通知バーの保存ボタンを制御してみた
- 自動化した処理が長いと進捗がわからんので、プログレスバーを出してみた
というところ。
またそのうち投稿します。