WEB Win標準装備FTPexeを使いVBAで操作-8
※より実装に近く表示させる為、コードの改行を避けています。スマホ等で閲覧される際は向きを変えてご覧ください。
※実装するバージョンによってはバージョンアップの仕様により動作しないコードもあります。実装には動作確認の上ご使用下さい。
MS-DOSコマンドプロンプトでFTPexeを操作する
- VBAで操作する前にWindowsに標準装備されているftp.exeを実際に操作してみる。
- 既にサーバ側にファイルをお持ちの方は実行動作確認テストをしてから行って下さい 。
- 「WEB Win標準装備FTPexeを使いVBAで操作-6」のバッチファイルとコマンドファイルを把握してからご覧下さい。
- VB又はVBAで記述する 。
1
- バッチファイルからコマンドファイルを生成する。
- 今度はWEB Win標準装備FTPexeを使いVBAで操作-6で作成したコマンドファイルをバッチファイルで作成します。
- 以下の例は「ftptest.bat」とファイル名を指定 。
:: バッチファイルの基礎 :: =============================================== :: ←[::]は[rem]つまりコメント :: *********************************************** :: 各環境変数定義(set) :: *********************************************** :: ■コマンドファイル生成場所の変数定義 set cmdPath=C:\Temp :: ■コマンドファイル名の変数定義 set cmdFire=%cmdPath%\ftptest.txt :: ----------------------------------------------- :: ■サーバ名の変数定義 set cmdopen=open jp-ia.com :: ■ユーザ名とパスワードの変数定義 set cmdpw=user ユーザ名 パスワード :: ■hashの変数定義 set cmdhash = hash :: ■モードの変数定義 set cmdascii = ascii :: ■アップ先の変数定義 set cmdcd=cd www/test/ :: ■アップ元の変数定義(日本語OK) set cmdlcd=lcd C:\Temp\アップ :: ■アップするファイルの変数定義 set cmdput = mput * .htm :: ■終了コマンドの変数定義 set cmdquit = Quit :: *********************************************** :: コマンドファイルに必要事項を入力記入 (echo) :: *********************************************** :: ※「>,>>」はリダイレクト :: ※「>」は新規又は上書き :: ※「>>」は追加 :: ※「%」環境変数を使う場合はその変数を「%」で囲みます echo %cmdopen%>%cmdFire% echo %cmdpw%>>%cmdFire% echo %cmdhash%>>%cmdFire% echo %cmdascii%>>%cmdFire% echo %cmdcd%>>%cmdFire% echo %cmdlcd%>>%cmdFire% echo %cmdput%>>%cmdFire% echo %cmdquit%>>%cmdFire% :: 終わり |
2
- ftptest.txtの中身。
- 上記を実行後、作成されたテキストファイル。
- C:\TempつまりCドライブ直下に[Temp]というフォルダを作成して下さい。(無い場合) 上記をテキストファイルにコピーし任意の場所へ保存後 [XXXX.bat]のような任意の名前に変更、実行してみて下さい
- どうですか?
- WEB Win標準装備FTPexeを使いVBAで操作-6で作成したコマンドファイルと粗同じものが C:\Tempに生成されています。
- [XXXX.bat]で使えるコマンドはコマンドファイルの実行の他にもコマンドファイルの削除等もっと沢山あります。
- 以下の例は「ftptest1.bat」とファイル名を指定
:: バッチファイルを実行、実行ログ作成 :: =============================================== :: ←[::]は[rem]つまりコメント :: *********************************************** :: 各環境変数定義(set) :: *********************************************** :: ■実行テキストファイルの変数定義 set cmdTxtPath=C:\Temp\ftptest.txt :: ■ログファイル生成場所の変数定義 set cmdLogPath=C:\Temp\ftplog :: ■日付を取得及び変数定義 set cmdDateA=%date% :: 必要箇所文字を取り出し結合 set cmdDateB=%cmdDateA:~0,4%%cmdDateA:~-5,2%%cmdDateA:~-2,2% :: ■時刻を取得及び変数定義 :: 空白を0に置き換え格納 set cmdTimeA=%time: =0% :: 必要箇所文字を取り出し結合 set cmdTimeB=%cmdTimeA:~0,2%%cmdTimeA:~3,2%%cmdTimeA:~6,2% :: ◇ログを保存するフォルダ作成 MkDir "%cmdLogPath%\" :: *********************************************** :: FTP実行 :: *********************************************** :: ◇テキストファイル実行及びログファイルの生成 ftp -vni -s:%cmdTxtPath%>%cmdLogPath%\%cmdDateB%_%cmdTimeB%.txt :: ◇実行テキストファイルの削除 del %cmdTxtPath% |
3
- 上記は先ほど作成したテキストファイル(コマンドファイル)を 実行し更に実行結果のログファイルを生成し 更にテキストファイル(コマンドファイル)を削除します
実行順は先ずftptest.batそれからftptest1.batになります。 - ftptest1.batはファイルをアップする実行を行いますので アップするファイル数により相応の時間を要します。
- 実行状況は非表示ですがログにはきちんと記録されます 。
- C:\Windows\Tempから実行ログファイルを探す。
- 上記がログファイル
- ハッシュは[###]で表示されます。
- 他にも「mput *.htm」の後に仮のファイルをアップして 今度はそのファイルを「get」コマンドでダウンロード という方法もありますがログを残すのがベターでしょう。
- VBやVBAで作成する場合もコマンドファイルテキストを作成し、それを実行する上記のようなftptest1.batを作成し ftptest1.batはタスクに登録PC電源を落とさず寝る
寝ているうちに実行。 - 朝、確認。
- その他サイトマップを生成しておき同じ要領でアップするなど いろいろアレンジして実行してみて下さい 。
- 同一時刻に実行されるよう設定された 2 つのタスクが存在すると問題が発生することがあります。最初のタスクが正しく発行されると、[タスクを実行中] と表示されます。
- このとき次のタスクが実行されないと、最初のタスクの後処理が完了しないままとなります。
- タスクの状態が [タスクを実行中] と表示されているため、以後 Mstask.exe がタスクを実行しようとし続けても実行されません。
- 同一時刻に実行されるよう設定された 2 つのタスクが存在すると問題が発生することがあります。最初のタスクが正しく発行されると、[タスクを実行中] と表示されます。
- このとき次のタスクが実行されないと、最初のタスクの後処理が完了しないままとなります。
- タスクの状態が [タスクを実行中] と表示されているため、以後 Mstask.exe がタスクを実行しようとし続けても実行されません。
4
VB/VBAから直接コマンドファイルテキストを実行しログファイルも作成する |
Sub ShellFTPlog() '***************************************** 'ShellでFTP.exeコマンドを実行しログを残す '***************************************** '通常このように記述しますが 'Shell(ftp -vni -s:"C:\Temp\ftptest.txt">"C:\Temp\ftplog\testLog.txt",6) 'ログを残すコマンド、[>]リダイレクトが付加する為 '①コマンドインタープリタ(16ビット) '②パイプ[|] '①~②の関係でエラーになります 'この場合は「コマンドプロンプト経由」で記述します Dim txtPath As String Dim cmd(4) As String Dim LogPath As String Dim RetVal As Variant cmd(1) = "cmd.exe /c " cmd(2) = "ftp -vni -s:" cmd(3) = ">" txtPath = """C:\Temp\ftptest.txt""" LogPath = """C:\Temp\ftplog\testLog.txt""" cmd(4) = cmd(1) & cmd(2) & txtPath & cmd(3) & LogPath 'cmd(4) =[cmd.exe /c ftp -vni -s:"C:\Temp\ftptest.txt">"C:\Temp\ftplog\testLog.txt"] RetVal = Shell(cmd(4), 6) If RetVal <> 0 Then MsgBox txtPath & vbCr & "実行されました。", vbInformation, "[タスクID]" & RetVal Else MsgBox txtPath & vbCr & "実行出来ません。", vbCritical, "[ERROR]" End If End Sub |