あるWindowsサーバのログファイルを別サーバへ定期的にFTP送信したいとの事で、VBSで簡単なスクリプトを作りました。これまでは、バッチやスクリプトでFTP用のコマンドファイルを作り、FTP -S:ファイル名で実行するような感じだったのですが、最近は、スクリプトだけでできるようです。
下記例は、D:\log\tempというディレクトリに一つのzipファイルが置かれており、そのファイルを送信するという前提です。
ちなみにzipファイル自体の名前でstrSrcを指定するとCopyHereが勝手にZipの中身を解凍した状態で送信されます。。そういや、CopyHereでzipの圧縮や解凍もできるからそういう事なんでしょうか。。恐るべしCopyHere
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
'FTP送信指定 Const HostName = "192.168.1.101" Const UserID = "userid" Const UserPass = "password" Const DestDir ="Upload" Dim strDest,strSrc, UpFileName, UpFileSize, oSH, objDest strSrc="D:\log\temp" strDest = "ftp://" & UserID & ":" & UserPass & "@" & HostName & "/" & DestDir Set oSH = CreateObject("Shell.Application") Set objDest = oSH.NameSpace(strDest) WScript.Echo "[" & strSrc & "]FTP転送対象" For Each objItem In oSH.NameSpace(strSrc).Items WScript.Echo "[" & strSrc & "]FTP転送ファイル [" & objItem.Name & "]," & objItem.Size UpFileName = objItem.Name UpFileSize = objItem.Size '&H04 + &H10は効かない・・・ objDest.CopyHere objItem, &H04 + &H10 Next '非同期なのでスリープで待つ・・・ Wscript.Sleep 15000 'リモートディレクトリの送信ファイル存在確認 Dim CheckOK, iWaitCnt CheckOK = False For iWaitCnt = 0 To 10 Set objDest = oSH.NameSpace(strDest) For Each objItems In objDest.Items If UpFileName = objItems.Name Then 'リモートファイルのサイズは取れないみたい・・・ WScript.Echo "[" & strSrc & "]FTP転送ファイル確認 [" & objItems.Name & "]," & objItems.Size CheckOK = True Exit For End If Next If CheckOK = True Then Exit For End If Wscript.Sleep 10000 WScript.Echo "FTP転送待ち[" & iWaitCnt & "]" Next If CheckOK = False Then WScript.Echo "FTP転送に失敗しました " & Err.Number Else WScript.Echo "FTP転送正常終了" End If |
でも、このCopyHere、FTPでは非同期のようで送信終了タイミングが解らなくスリープ待ちせざるを得なかったり、上書き確認のダイアログがどうしても消せない等、ちょっとクセが強いです。。
今回の要件的にはまあ上書きの対処は見切りました。確実性が必要な処理だとこのやり方はしないかな~