連携 指定サーバにファイルをアップFTPexeを使いタスク登録し指定時刻に実行

※より実装に近く表示させる為、コードの改行を避けています。スマホ等で閲覧される際は向きを変えてご覧ください。

※実装するバージョンによってはバージョンアップの仕様により動作しないコードもあります。実装には動作確認の上ご使用下さい。

Option Explicit


Sub FTPautoTaskRegist(CDpath As String, LCDpath As String, strTime As String)
'***************************************
'FTPexeを使いタスク登録し指定時刻に実行
'***************************************
'CDpath     UPするサーバアドレス                    例[www/test/]
'LCDpath    UPされるファイルがあるローカルアドレス  例[C:\Temp\アップ]
'strTime    UP時刻                                  例[20:00](小文字必須)

Dim strFilePath As String
Dim strFileName As String
Dim CommandFileName As String
Dim BatFileName As String
Dim ServerName As String
Dim UserID As String
Dim UserPassword As String
Dim strMode As String 'ascii / binary or asc / bin アスキー / バイナリ
Dim Extension As String
Dim FileNO As Integer 'ファイル番号
Dim CommandFileFullPath As String
Dim BatFileFullPath As String

'---------------------------------------------------------------------
'パラメータ(お好み環境に変更してください)
strFilePath = "C:\Temp"         'コマンドファイルの場所
ServerName = "jp-ia.com"        'UPサーバ名
UserID = "xxxx"                 'ユーザーID
UserPassword = "zzzzzz"         'パスワード
strMode = "ascii"               'モード
Extension = "htm"               'UP対象ファイルの拡張子

'---------------------------------------------------------------------
'コマンドファイル作成 ①

'ファイル名作成
strFileName = Format(Date, "yyyymmdd") & "_" & Format(time, "hhnnss")
'コマンドファイル名
CommandFileName = strFileName & ".txt"

CommandFileFullPath = strFilePath & "\" & CommandFileName 'フルパス定義
FileNO = FreeFile 'ファイルID取得

Open CommandFileFullPath For Output As #FileNO '新規作成

Print #FileNO, "open " & ServerName
Print #FileNO, "user " & UserID & " " & UserPassword
Print #FileNO, "hash"
Print #FileNO, strMode
Print #FileNO, "cd " & CDpath
Print #FileNO, "lcd " & LCDpath
Print #FileNO, "mput *." & Extension
Print #FileNO, "Quit"

Close #FileNO 'ファイルを閉じる
'---------------------------------------------------------------------
'実行バッチファイルの作成 ②

'バッチファイル名
BatFileName = strFileName & ".bat"
BatFileFullPath = strFilePath & "\" & BatFileName 'フルパス定義
FileNO = FreeFile 'ファイルID取得
Open BatFileFullPath For Output As #FileNO '新規作成

'実行コマンドファイルの変数定義
Print #FileNO, "set cmdTxtPath=" & CommandFileFullPath
'ログファイル生成場所の変数定義
Print #FileNO, "set cmdLogPath=" & strFilePath & "\ftplog"
'日付を取得及び変数定義
Print #FileNO, "set cmdDateA=%date%"
'必要箇所文字を取り出し結合
Print #FileNO, "set cmdDateB=%cmdDateA:~0,4%%cmdDateA:~-5,2%%cmdDateA:~-2,2%"
'時刻を取得及び変数定義
'空白を0に置き換え格納
Print #FileNO, "set cmdTimeA=%time: =0%"
'必要箇所文字を取り出し結合
Print #FileNO, "set cmdTimeB=%cmdTimeA:~0,2%%cmdTimeA:~3,2%%cmdTimeA:~6,2%"
'ログを保存するフォルダ作成
Print #FileNO, "mkdir " & """%cmdLogPath%\"""
'コマンドファイル実行及び④ログファイルの生成
Print #FileNO, "ftp -vni -s:%cmdTxtPath%>%cmdLogPath%\%cmdDateB%_%cmdTimeB%.txt"
'実行コマンドファイルの削除①
Print #FileNO, "del %cmdTxtPath%"

Close #FileNO 'ファイルを閉じる
'---------------------------------------------------------------------
'作成した実行バッチファイルをタスクに登録 ③
Dim cmd(6) As String
Dim RetVal As Variant
Dim batPath As String

batPath = "" & BatFileFullPath & ""
cmd(1) = "at "
cmd(2) = strTime
cmd(3) = " /"
cmd(4) = "interactive "
cmd(5) = ""                         'オプション[本日1回だけ実行]

'コマンド及び実行バッチパス
cmd(6) = cmd(1) & cmd(2) & cmd(3) & cmd(4) & cmd(5) & batPath

'タスクID取得及びタスクスケジューラに登録
RetVal = Shell(cmd(6), 6)

If RetVal <> 0 Then
    MsgBox batPath & vbCr & "本日" & strTime & "実行のタスク登録が登録されました。" _
    & vbCr & CommandFileFullPath & vbCr & "タスク" & vbCr & _
    "は自動的にタスク実行後に削除されます。", vbInformation, "[タスクID]" & RetVal
Else
    MsgBox batPath & vbCr & "タスク登録は実行出来ません。", vbCritical, "[ERROR]"
End If

End Sub


Private Sub Test()
    FTPautoTaskRegist "www/test/", "C:\Temp\アップ", "17:59"
End Sub

上記のPrivate Sub Test()を実行すると(実行した日付が2010/01/06の場合)

登録完了メッセージが表示 OK
  • C:\Temp に
  • ②20100106_175715.bat と
  • ①20100106_175715.txt が
  • 実行された日付時刻形式で作成される
  • 指定された時刻に実行予定の
  • ③タスクがスケジュールされ追加される
  • ここでは「At1」
  • タスクが実行された後は
  • ③そのタスクは自動で削除される
  • (1回だけの実行の場合)
  • 作成したbatファイルによりコマンドファイル
  • ①20100106_175715.txt が削除される
  • このファイルにはIDやパスワードが記載されている
  • ②20100106_175715.bat は実行後も残る
  • 不要な場合は手動で削除する
  • このファイルにはIDやパスワードは記載されていない
  • 指定(作成)したC:\Temp\ftplog には ログファイルが 実行された日付時刻形式で 作成される④
  • ログを確認後不要な場合は手動で削除する
  • このファイルにはIDやパスワード及び実行ログが記載されている

①20100106_175715.txt の中身

open jp-ia.com
user xxxx zzzzzz
hash
ascii
cd www/test/
lcd C:\Temp\アップ
mput *.htm

②20100106_175715.bat の中身

set cmdTxtPath=C:\Temp\20100106_175715.txt
set cmdLogPath=C:\Temp\ftplog
set cmdDateA=%date%
set cmdDateB=%cmdDateA:~0,4%%cmdDateA:~-5,2%%cmdDateA:~-2,2%
set cmdTimeA=%time:&nbsp;=0%
set cmdTimeB=%cmdTimeA:~0,2%%cmdTimeA:~3,2%%cmdTimeA:~6,2%
MkDir "%cmdLogPath%\"
ftp -vni -s:%cmdTxtPath%>%cmdLogPath%\%cmdDateB%_%cmdTimeB%.txt
del %cmdTxtPath%

C:\Temp\ftplog\20100106_175900.txt ログの中身

ftp> ftp> open jp-ia.com
ftp> user xxxx zzzzzz
Hash mark printing On ftp: (2048 bytes/hash mark) .

ftp> hash
ftp> ascii
ftp> cd www/test/
Local directory now C:\Temp\アップ.

ftp> lcd C:\Temp\アップ
mput *.htm
##########
########
########
##########
ftp> Quit

※##########の部分がハッシュ(実行された時間を#で示したもの)

Mstask.exe(タスクスケジューラ)

同一時刻に実行されるよう設定された 2 つのタスクが存在すると問題が発生することがあります。最初のタスクが正しく発行されると、[タスクを実行中] と表示されます。このとき次のタスクが実行されないと、最初のタスクの後処理が完了しないままとなります。タスクの状態が [タスクを実行中] と表示されているため、以後 Mstask.exe がタスクを実行しようとし続けても実行されません。

 

 

 

2000年01月01日|[VBサンプルコード]:[連携]