ある案件で、WindowsでファイルをZIPした後、FTPSでアップロードする必要がでてきたのでメモしておきます。
UNIX(Linux)環境なら、3分で終わることがいろいろ大変でした。早くWindowsでもbashが使えるようになってほしいものです。
やりたいこと
- ファイルをzipで圧縮
- FTPSでアップロード
- 上記をバッチ化し、1時間に一度、自動実行
準備
ZIP
まず、Windowsでは原則コマンドラインで使えるzipコマンドがありません。最近のPowerShell環境だと使えるコマンドもあるらしいのですが、環境依存を避けたいので、7zipを使うことにします。
ここから32bitの「7-Zip コマンドラインバージョン」というのダウンロードし、展開します。
とりあえず、
C:\7zip\7za.exe
でコマンドが使えるようにしました。
基本的な使い方として、
C:\7zip\7za.exe a 圧縮先.zip 圧縮元.txt
という感じのようです。
aをお忘れなく。
FTPS(WinSCP)
WindowsにはFTPコマンドがありますが、FTPSには対応していないようです。
なので、ツールとしてWinSCPを利用します。
とりあえずここからダウンロードし、インストールします。
対話的シェルで使うのが普通なようですが、ここではバッチ化するのでコマンドは外部ファイルに書いてみたいと思います。
基本的な使い方としては、
C:\Program Files (x86)\WinSCP\WinSCP.exe /script=test.ftps
という形式で、この例では、test.ftpsに実行したいFTPSコマンドを書きます。
open ftps://account:password@servername -explicit
cd data
put test.txt
exit
ftpsのホスト名、ID,PWの記述が少々変わってますね。
自動化
UNIXならcronで簡単処理ですが、Windowsだとタスクスケジューラを使います。慣れれば簡単ですが、下記のようなクセがあります。
- ウィザードで日単位以下のタスクを設定できない(一度作成後に設定可能)
- 開始(オプション)を指定しないと動かない
開始(オプション)で、バッチファイルのPATHを指定しないと行けないようです。
一連の機能をバッチ化し実行してみる
ここではC:¥worksというフォルダを作成し、バッチファイルや必要なファイルをそこに置くことにします。
バッチファイルの作成
zip_ftps.batというファイルを作成し、下記のように記述しました。
"C:¥7zip\7za.exe" a C:\works\foo.zip C:\works\foo.txt
"C:\Program Files (x86)\WinSCP\WinSCP" /script="C:\works\test.ftps"
del C:\works\foo.zip
C:\works\foo.txtというファイルをfoo.zipという名で圧縮し、FPTSでアップします。
いちおうdelで掃除しておきます。
test.ftpsファイルは、
open ftps://account:password@servername -explicit
cd files
put c:\works\foo.zip
exit
という感じで、生成したzipファイルをputするように指定しています。
-explicitや移動するフォルダなどは各自の環境に合せます。
バッチファイルの実行
事項は、
C:¥works¥zip_ftps.bat
とすることで実行できます。zipが生成され、FTPSされているか確認してください。
自動化する
このバッチファイルをタスクスケジューラに登録して自動化します。
[管理ツール]の[タスクスケジューラ]を起動し、[基本タスクの作成]を選択します。
するとウィザードが起動します。
- タスク名の入力
- トリガー(タスク開始のタイミング)→適当に設定
- トリガー(間隔設定)→適当に設定
- タスクの操作→プログラムの開始
- 開始するプログラム/スクリプトの場所、オプション
を設定します。冒頭でも説明しましたが、ウィザードではトリガー(起動間隔)が日以下の単位で設定できません。そのため、一度ダミーで設定しておき、作成後に編集します。
登録後のトリガーの編集
登録後、トリガーの編集を選択し、繰り返し間隔を編集します。
プログラム/スクリプト等の設定
どうやら開始(オプション)に、バッチファイルが存在するPATHを指定しないと正しく実行されないようです。。。
即時実行
プログラムが即時実行できるかを試したい場合は、タスクスケジューラの一覧から対象のタスクを右クリックし、実行を選択します。
簡単ながらとりあえず以上です。