あるWindowsサーバのログファイルを別サーバへ定期的にFTP送信したいとの事で、VBSで簡単なスクリプトを作りました。これまでは、バッチやスクリプトでFTP用のコマンドファイルを作り、FTP -S:ファイル名で実行するような感じだったのですが、最近は、スクリプトだけでできるようです。
下記例は、D:\log\tempというディレクトリに一つのzipファイルが置かれており、そのファイルを送信するという前提です。
ちなみにzipファイル自体の名前でstrSrcを指定するとCopyHereが勝手にZipの中身を解凍した状態で送信されます。。そういや、CopyHereでzipの圧縮や解凍もできるからそういう事なんでしょうか。。恐るべしCopyHere
'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では非同期のようで送信終了タイミングが解らなくスリープ待ちせざるを得なかったり、上書き確認のダイアログがどうしても消せない等、ちょっとクセが強いです。。
今回の要件的にはまあ上書きの対処は見切りました。確実性が必要な処理だとこのやり方はしないかな~