大阪府摂津市JR千里丘駅周辺密着情報!!

WinSCPのコマンドでミラーリングダウンロードを実現WinSCPのコマンドでミラーリングダウンロードを実現

  1. はじめに
  2. 実現したかったこと
  3. 実現のための準備(必須)
  4. バッチファイル(.bat)の作成
  5. INIファイル(WinSCP.ini)の変更
  6. バッチファイルの実行
  7. バッチファイルをタスクスケジューラーで管理

1. はじめに

WinSCPで用意されているコマンドを利用しただけでは要求する機能を満たしていなかったので何とかならないものかと悪戦苦闘した結果、とりあえず何とかなったので覚え書きの意味と、同じような悩みを抱えている人の役に立てればと、可能な限り初心者にも分かりやすく手順を記しておくことにしてみた。

ただし、環境はWindows 7、WinSCP ver4.3.8(build 1771)に特化しているので他のことは知らん。

2. 実現したかったこと

とにかくやりたかったのは以下の通り

  1. バックアップ作業の簡略化
    • そのための処理をコマンドで記述
    • バッチファイルとして保存して自動処理させる
  2. ミラーリングダウンロードの実現
    • 言い換えれば差分ダウンロード増分ダウンロード的な処理
      1. ホスト(Webサーバー)のディレクトリ(フォルダ)とローカルを比較
      2. 更新されていなければ放置
      3. 更新されていればダウンロード
      4. ローカルに存在しないファイル/フォルダがあればダウンロード
        • Perl(CGI)、PHPなどがサーバー上で生成したファイル/フォルダをバックアップ
      5. サーバー上で削除されたファイル/フォルダはローカルからも削除
        • Perl(CGI)、PHPなどがサーバー上で削除したファイル/フォルダをローカルでも削除
  3. 定期的にバッチ処理を自動実行
    • Windowsのタスクスケジューラで定期的に自動実行

3. 実現のための準備

早々にコマンドの記述に進みたいところだが、実現のためには必ずやって置かなければならないことがあったり。

  1. とにかくWinSCPがインストールされていること
    • 無いなら去るがよろし
  2. WinSCPのショートカットアイコンがデスクトップとかにあること
    • 無いならサクサク作成なされ
  3. バックアップ目的のサイトの登録が終わっていること
    • まだなら急ぎ登録すべし
  4. ここからが重要でWinSCPの設定内容がレジストリではなくINIファイルに保存されていること。
    • 後にアプリケーションのパラメータを変更する必要があるのでこれは必須作業
    • 通常はレジストリに保存されているので、とりあえずINIファイルへの保存方法
        1. ログイン画面の左側にある項目の最下部、『設定』 をクリック
        2. 表示される画面の『環境設定』ボタンをクリック

      1. 1. 環境設定画面の左側にある項目の下部、『保存』 をクリック
        2. 表示される画面の『INI file(WinSCP.ini)』をクリック
        3. 『エクスポート』ボタンをクリック

        • 場所を指定して保存
        • 保存場所はどこでもかまわないが、アプリケーションと同じ場所(C:\Program Files\WinSCP)は避けたほうが良いかと(Windows 7の場合、良からぬ動きをするようなことを何かで読んだ記憶があったりなかったり)
      2. 保存が終わったらWinSCPを終了
      3. WinSCPのショートカットアイコンを右クリック
        • 表示されるメニューの『プロパティ』をクリック
          1. ショートカットタブをクリック
          2. 『リンク先(T):』を編集
            • WinSCPを素直にインストールした場合、内容は
              "C:\Program Files\WinSCP\WinSCP.exe"
              となっているはず
            • その後ろに追記して以下のようにする
              "C:\Program Files\WinSCP\WinSCP.exe" /ini=C:\Users\xxxx\Documents\WinSCP.ini
              /ini= から後ろは格納されている INIファイルを指定
                 = 半角スペース、   = 人それぞれ、   = 上記4-3で素直にマイ ドキュメントに保存した場合
              素直じゃない人は格納した場所とファイル名を指定。
          3. 追記が終わったら『適用(A)』ボタンをクリック
    • 以上の下準備によって、今後WinSCPは必ずINIファイル(WinSCP.ini)を読み込んで起動し、設定の変更、セッションの追加削除などがあればINIファイルに保存するようになる
  5. 以上で実現のための準備は完了、お疲れ様。

4. バッチファイル(.bat)の作成

  1. まずはメモ帳でも秀丸でも、とにかくテキストエディタと呼ばれるものを開く
  2. とにかく以下を記述
    echo off
    set SESSION=接続したいセッション
    set SCRIPT=C:\任意のフォルダ\scpdownload.txt
    set TARGET=C:\ローカルディレクトリ
    echo cd リモートディレクトリ > %SCRIPT%
    echo synchronize local %TARGET% >> %SCRIPT% -delete
    echo exit >> %SCRIPT%
    cd \
    cd "Program Files\WinSCP"
    winscp.com /ini=C:\INIファイルのフォルダ\WinSCP.ini %SESSION% /script=%SCRIPT%
    pause > nul
    
    • 2行目の接続したいセッション
      • WinSCPに保存してあるセッションのこと
      • セッション名が『俺様のホームページ』なら、日本語でそのまま
        set SESSION=俺様のホームページ
        
        と記述する
      • セッションをフォルダを作成して管理している場合は/(半角スラッシュ)で区切って指定
        • 例として、OriginalフォルダのWebSiteフォルダにある俺様のホームページなら

          set SESSION=Original/WebSite/俺様のホームページ
          
          と記述する
    • 3行目の任意のフォルダ
      • リモートディレクトリとローカルのフォルダ(ディレクトリ)を比較したログを一時的に保存したいだけ
      • 基本的にはデスクトップでもマイドキュメントでも何でも自由
      • ただし、毎回削除したりするのも面倒なので後述するローカルディレクトリと同じで良いのではないかと
    • 4行目のローカルディレクトリ
      • PCに保存されている対象のフォルダを指定
      • 面倒なのでWinSCPのログイン画面左にある『ディレクトリ』をクリック

      • ローカルディレクトリの部分に(A)をコピペ
        ※ エクスプロラー風の外観で使っていて未入力の場合は自分でガンバること!
    • 5行目のリモートディレクトリ
      • 対象のリモートディレクトリを指定
      • 面倒なので上記画像の(B)リモートディレクトリの部分にコピペ
    • 6行目の -delete
      • このオプションを付与しておくと、サーバーになくてローカルにのみ存在するファイルを削除してくれる
      • ローカルに重要なファイルがあるのなら -deleteは記述しないこと
    • 10行目のINIファイルのフォルダ
      • 長らくおまたせいたしましたっ!ここでやっと『実現のための準備』でやった作業が報われるんだっ
      • INIファイルのフォルダの部分にWinSCP.iniが保存されているフォルダを記述
    • 11行目のpause > nul
      • これは最終的に削除する
      • cmd.exeっていう奴がバッチ処理を終わらせてもウィンドウを閉じないようにしてるだけ
      • とりあえず動作を確認するまで残しておくが吉
  3. 記述は終わりなので名前をつけてファイルを保存
    • 名前は自由だが拡張子は.batに
    • 『俺様のホームページ』のバッチファイルなら oresama-hp.bat とかテキトーに
  4. 以上でバッチファイルの作成は完了、お疲れ様。
    • 言っておくけど作成したバッチファイルをダブルクリックすると実行しちゃうからね
    • ファイルを開いて内容の変更とかしたかったらメモ帳とか秀丸とか、テキストエディタと呼ばれるもののアイコンか、アプリケーション開いた上でドラッグ&ドロップすること

5. INIファイル(WinSCP.ini)の変更

  1. ここで更に『実現のための準備(必須)』での作業が重要な意味を持ってきたりする
  2. 実は、作成したバッチファイルをこのまま実行しても『実現したかったこと』の要求を満たすことができない
  3. WinSCP.iniを開いてパラメータを変更する必要があるので『実現のための準備(必須)』で設定した保存場所に走って行ってWinSCP.iniを開く(ダブルクリックするとメモ帳で開く)
  4. で、とにかく『SynchronizeParams=』という項目を探す(検索するよろし)
  5. たぶん
    SynchronizeParams=70
    になっている(あれ?60だったかな?忘れちまった)ので、その値を 2に変更
    SynchronizeParams=2
  6. ここを変更しておかなければサーバで生成されてローカルに存在しないファイル(増分)をバックアップ(ダウンロード)できない
  7. 以上でバッチファイルの作成は完了、お疲れ様。
    • !!厳重注意!! 原因は定かではないどWinSCPで何か設定変更したらパラメータが 70に戻ったことがあったような気がするので、もし正常動作しなくなったらINIファイルを見てみると幸せになれるかもしれない

6. バッチファイルの実行

  1. バッチファイル(.bat)の作成』でできたファイルをダブルクリックするとバッチ処理が始まる
  2. 内容はおおまかに以下のような感じ
       の部分は人それぞれ
    echo off
    サーバを探索中・・・
    サーバに接続しています・・・
    認証しています・・・
    ユーザ名"********" を使用中
    入力済みパスワードで認証中
    認証されました
    セッションを開始しています・・・
    リモートディレクトリを読み込み中・・・
    セッションを開始しました
    アクティブセッション: [1] Original/WebSite/俺様のホームページ
    /***/***/***
    比較中...
    ローカル 'C:\*****\*****' <= リモート '/***/***/***
    ローカル 'C:\*****\*****' <= リモート '/***/***/***
    ローカル 'C:\*****\*****' <= リモート '/***/***/***
    ローカル 'C:\*****\*****' <= リモート '/***/***/***
    ローカル 'C:\*****\*****' <= リモート '/***/***/***
    同期中...
    ローカル 'C:\*****\*****' <= リモート '/***/***/***
    index.html                |          5 KiB |   28.6 KiB/s | ascii  | 100%
    sample.xml.gz             |          4 KiB |   27.9 KiB/s | binary | 100%
    'C:\Users\*****\***\scpdownload.txt' を削除しました
    
    1. サーバーに接続
    2. セッションの開始
    3. 比較中... → ローカル(PC)とリモート(Webサーバー)のディレクトリ(フォルダ)内容を比較
    4. 同期中... → ここで更新されているファイル、サーバーにしか存在しないファイルをダウンロード
    5. サーバー上で削除された(ローカルにしか存在しない)ファイルも削除
  3. 思い通りに動作していることが確認できたらバッチファイルの最終行、pause > nulを削除して保存
    • もし思い通りに動いてくれない場合は・・・ 自力でウンウン言いながら頑張ってちょ
  4. 以上で操作確認は完了、お疲れ様。

バッチファイルをタスクスケジューラーで管理

タスクスケジューラで定期的にバッチ処理を実行するっていうことは定期的にサイトのバックアップをするってことに

  1. まずはWindowsのタスクスケジューラを起動
    • 『スタート』→『コントロールパネル』→『管理ツール』→『タスクスケジューラ』をダブルクリック
    • 見つけられない人は『スタート』の [ プログラムとファイルの検索 ] に ”タスク” と入力するが吉
    • それもできない人は誰かに助けてもらうべき
  2. ここは好みの問題だけど他のタスクと区別するためにフォルダーなんか作ってみたり
    1. 画面右側の『タスクスケジューラライブラリ』を選択して右クリック
    2. 『新しいフォルダー(N)...』をクリック
    3. 自由な名前をつけて [ OK ]
  3. 作成したフォルダをクリックで選択状態にした後、画面右側の『基本タスクの作成...』をクリック
  4. 表示されるウィザードの『名前(A):』と必要があれば『説明(D):』を入力

    • 日本語でも何でも分かりやく命名してやる
    • 入力が終わったら [ 次へ(N) > ] ボタンをクリック
  5. 次に何をきっかけに動作させるかを設定

    • ここはもう、人それぞれなので説明不能
    • とりあえず毎週バックアップするってことで次に進んでみる
    • もっと詳しく知りたい人はそれなにりググってちょ
  6. ここも自由なので説明不能

    • とりあえず毎週土曜日の午後8時30分になったら始めてねって指定してみた
    • それぞれ設定が終わったら [ 次へ(N) > ] ボタンをクリック
  7. ここはもちろんバッチ処理を実行するので『プログラムの開始(T)』を選択

    • 選択したら [ 次へ(N) > ] ボタンをクリック
  8. ここはもちろんバッチ処理を実行するので『プログラムの開始(T)』を選択

    • 選択したら [ 次へ(N) > ] ボタンをクリック
  9. いよいよ処理させるバッチを選択するので [ 参照(R)... ] ボタンをクリック

    • 表示されるダイアログで作成したバッチファイル(***.bat)を探して選択する
    • 選択したら [ 開く(O) ] ボタンをクリック
    • 選択が完了したら [ 次へ(N) > ] ボタンをクリック
  10. これで設定が終わったので [ 完了(F) ] ボタンをクリック

  11. 以上でタスクの作成は完了、お疲れ様。
    • 思った通りの動作をするかどうかは設定したトリガー(きっかけ)で動くのを待つしかない
    • すぐにでも確認したかったら数分後に発動するように設定してみるしかない

最後に

これにて WinSCPをコマンド操作してミラーリングダウンロードを実現し、それを定期的に実行する方法の説明は終わり。

長文、駄文に最後まで付き合ってもらってありがとさん。

うまくいってもお礼はいらないから失敗しても文句言ってこないでね。

Windowsが 8になったり、それより進んだり、WinSCPのバージョンが変わって、ここに記載したやり方が通用しなくなってもメンテしないかもしんないけどご容赦を。



  • 誤字脱字に関してはご勘弁の程を
  • 記述内容に重大な間違いがある場合や、あまりにも不明瞭な点がある場合は以下のメアドまで
  • ただし、質問等を頂いても返信できません

Tech 担当宛にメール