WinSCPでディレクトリを自動同期する方法【スクリプト・スケジュール実行対応】【2025年版】

2012年9月10日


WinSCPはGUIでのSFTP/FTPファイル転送ツールとしてよく知られているが、コマンドラインモード(WinSCP.com)を使うとスクリプトによる自動同期が実現できる

このガイドを完了すると、以下のことができるようになる。

  • WinSCPスクリプトでWindowsフォルダ ↔ Linuxサーバのディレクトリを双方向同期
  • keepuptodate コマンドによるリアルタイム監視・自動転送
  • Windowsタスクスケジューラで定期バックアップ・同期を完全自動化
  • 特定のファイル・フォルダを除外するフィルタリング設定

実際にWinSCP 6.xで動作確認済みの手順を掲載している。

WinSCPコマンドラインでディレクトリ同期が完了した状態のターミナル画面


前提条件

このガイドを進める前に、以下の環境・知識が必要。

  • 環境: Windows 10 / 11
  • 必要なツール: WinSCP(5.x以降、最新版推奨) — 公式サイトからダウンロード
  • 接続先: SSH/SFTPが有効なLinuxサーバ(または FTPサーバ)
  • 前提知識: Windowsのコマンドプロンプト基本操作、SSHの基礎
# WinSCP.comのバージョン確認(コマンドプロンプトで実行)
"C:\Program Files (x86)\WinSCP\WinSCP.com" /help

なくてもOK: 管理者権限。一般ユーザ権限でも動作する。タスクスケジューラへの登録は一般ユーザ権限でも可能。


全体の流れ

このガイドは以下の4ステップで構成されている。

  1. WinSCPスクリプトファイルの作成 — 5分
  2. スクリプトの動作確認とオプション詳解 — 10分
  3. リアルタイム監視(keepuptodate)の設定 — 5分
  4. タスクスケジューラで定期自動実行 — 10分

WinSCP自動同期の全体フロー図(スクリプト作成→実行→タスクスケジューラ登録の流れ)


ステップ1: WinSCPスクリプトファイルの作成

WinSCPはコマンドラインモード用の実行ファイル WinSCP.com を持っており、テキストファイルに書いたスクリプトを読み込んで実行する。まずはスクリプトファイルを作成する。

基本的なスクリプト構文

スクリプトファイルはプレーンテキスト(.txt 拡張子でOK)で、以下の構文で書く。

option batch on
option confirm off
open sftp://ユーザ名:パスワード@サーバIPアドレス
sync remote -filemask="| .svn/;*.log" -delete ローカルパス リモートパス
exit

実際のスクリプト例

以下は C:\Users\username\Documents\project/home/username/product へ同期するスクリプトの例。

option batch on
option confirm off
open sftp://deploy@192.168.1.100

sync remote -filemask="| .svn/;*.log;node_modules/" -delete C:\Users\username\Documents\project /home/username/product

exit

このファイルを C:\Users\username\Documents\winscp-sync.txt として保存する。

各コマンドの説明

コマンド 説明
option batch on バッチモード有効。確認プロンプトをスキップしてエラー時に処理続行
option confirm off 上書き確認ダイアログを非表示にする
open sftp://... SFTP接続を開く。FTPの場合は ftp:// を使う
sync remote ローカル→サーバ方向に同期(サーバ側を更新)
-filemask 同期対象から除外するファイル・ディレクトリのパターン
-delete ローカルに存在しないファイルをサーバから削除する
exit 接続を閉じてスクリプトを終了

sync コマンドの方向指定

sync コマンドには3つの方向がある。

sync local   ローカルパス リモートパス   # サーバ→ローカルに同期
sync remote  ローカルパス リモートパス   # ローカル→サーバに同期
sync both    ローカルパス リモートパス   # 双方向同期(新しいほうを優先)

WinSCPのsyncコマンドの方向を示す図(local/remote/both)

ステップ1完了の確認: スクリプトファイルがテキストエディタで正常に開ける状態になっていること。


ステップ2: スクリプトの動作確認とオプション詳解

作成したスクリプトを実際に実行して動作確認する。

コマンドプロンプトからの実行

"C:\Program Files (x86)\WinSCP\WinSCP.com" /script="C:\Users\username\Documents\winscp-sync.txt"

64bit版Windowsで32bit版WinSCPをインストールした場合は上記のパスになる。64bit版の場合は以下。

"C:\Program Files\WinSCP\WinSCP.com" /script="C:\Users\username\Documents\winscp-sync.txt"

SSH公開鍵認証を使う場合(推奨)

パスワードをスクリプトに直書きするのはセキュリティ上好ましくない。SSH公開鍵認証を設定済みであれば、以下のように秘密鍵ファイルを指定できる。

option batch on
option confirm off
open sftp://deploy@192.168.1.100 -privatekey="C:\Users\username\.ssh\id_rsa.ppk"

sync remote -filemask="| .git/;node_modules/;*.log;*.tmp" -delete C:\Users\username\Documents\project /home/username/product

exit

注意: WinSCPが扱う秘密鍵は PPK形式(PuTTY形式)。OpenSSH形式の秘密鍵(id_rsa)は、WinSCPに付属の PuTTYgen で変換する必要がある。

PuTTYgen を起動 → 「Load」で id_rsa を読み込み → 「Save private key」で .ppk ファイルとして保存。

ショートカットファイルで簡単実行

毎回コマンドプロンプトを開くのは手間なので、デスクトップにショートカットを作成する。

  1. デスクトップで右クリック → 「新規作成」→「ショートカット」
  2. 場所に以下を入力:
    "C:\Program Files (x86)\WinSCP\WinSCP.com" /script="C:\Users\username\Documents\winscp-sync.txt"
  3. 名前を「WinSCP同期」等にして完了

WinSCPショートカットのリンク先にスクリプトパスを指定した設定画面

filemask の書き方

-filemask はファイル除外パターンを指定する重要なオプション。

# 複数のパターンをセミコロンで区切る
-filemask="| .git/;node_modules/;*.log;*.tmp;.DS_Store"

# 「|」(パイプ)の後が「除外リスト」になる
# 「|」の前が「含めるリスト」(省略可)
パターン例 説明
*.log 全ての .log ファイルを除外
.git/ .git ディレクトリを除外(末尾の / が重要)
node_modules/ node_modules ディレクトリを除外
.svn/;*.bak .svn ディレクトリと .bak ファイルを除外

ステップ2完了の確認: スクリプトを実行してエラーなく同期が完了し、サーバ上にファイルが反映されること。


ステップ3: リアルタイム監視(keepuptodate)の設定

keepuptodate コマンドを使うと、ローカルフォルダの変更をリアルタイムで検知してサーバに自動転送できる。開発中のファイルを継続的にサーバに反映したい場合に便利。

keepuptodate を使ったスクリプト

option batch on
option confirm off
open sftp://deploy@192.168.1.100 -privatekey="C:\Users\username\.ssh\id_rsa.ppk"

keepuptodate -filemask="| .git/;node_modules/;*.log" -delete C:\Users\username\Documents\project /home/username/product

exit

keepuptodatesync と同様のオプションを持つが、一度実行すると終了せず監視状態を維持する。Ctrl+C を押すまでフォルダを監視し続ける。

sync と keepuptodate の使い分け

コマンド 動作 適した用途
sync 1回だけ同期して終了 バックアップ、定期バッチ実行
keepuptodate 変更を検知して都度転送(常駐) 開発中のファイルのリアルタイム反映

sync + keepuptodate の組み合わせ

起動時に完全同期してから、その後はリアルタイム監視するパターンが最も実用的。

option batch on
option confirm off
open sftp://deploy@192.168.1.100 -privatekey="C:\Users\username\.ssh\id_rsa.ppk"

# まず現在の差分を全て同期
sync remote -filemask="| .git/;node_modules/;*.log" -delete C:\Users\username\Documents\project /home/username/product

# その後リアルタイム監視に移行
keepuptodate -filemask="| .git/;node_modules/;*.log" -delete C:\Users\username\Documents\project /home/username/product

exit

keepupdateコマンドが実行中で変更を監視している状態のコマンドプロンプト画面

ステップ3完了の確認: keepuptodate 実行後にローカルのファイルを変更すると、数秒以内にサーバに反映されること。


ステップ4: タスクスケジューラで定期自動実行

Windowsのタスクスケジューラに登録すれば、毎日深夜や毎時間など定期的にバックアップ・同期を自動実行できる。

バッチファイルの作成

タスクスケジューラから直接 WinSCP.com を呼び出すより、バッチファイル経由にすると管理しやすい。

C:\Users\username\Documents\winscp-sync.bat を以下の内容で作成:

@echo off
set WINSCP="C:\Program Files (x86)\WinSCP\WinSCP.com"
set SCRIPT="C:\Users\username\Documents\winscp-sync.txt"
set LOG="C:\Users\username\Documents\winscp-sync.log"

%WINSCP% /script=%SCRIPT% /log=%LOG% /loglevel=1

if %ERRORLEVEL% equ 0 (
    echo [%date% %time%] 同期成功 >> "C:\Users\username\Documents\sync-result.log"
) else (
    echo [%date% %time%] 同期失敗 エラーコード: %ERRORLEVEL% >> "C:\Users\username\Documents\sync-result.log"
)

/log オプションでWinSCPの詳細ログを記録できる。/loglevel=1 は最低限の情報、/loglevel=2 は詳細ログ。

タスクスケジューラへの登録手順

  1. スタートメニューで「タスクスケジューラ」を検索して起動
  2. 右側の「タスクの作成」をクリック
  3. 「全般」タブ:
  4. 名前: WinSCP自動同期
  5. 「最上位の特権で実行する」は不要(一般権限でOK)
  6. 「トリガー」タブ → 「新規」:
  7. 毎日実行する場合: 「毎日」を選択し、開始時刻(例: 深夜2:00)を指定
  8. 毎時間実行する場合: 「1日」→「繰り返し間隔: 1時間」を設定
  9. 「操作」タブ → 「新規」:
  10. 操作: 「プログラムの開始」
  11. プログラム: C:\Users\username\Documents\winscp-sync.bat
  12. 「条件」タブ:
  13. 「コンピューターをAC電源で使用している場合のみタスクを開始する」は必要に応じてOFF
  14. 「OK」をクリックして保存

Windowsタスクスケジューラのタスク作成画面でWinSCPバッチを登録している様子

タスクの動作確認

登録後、右クリック→「実行」で即時実行してテストできる。ログファイル(sync-result.log)に「同期成功」と記録されれば完了。

ステップ4完了の確認: タスクスケジューラから手動実行して同期ログに成功と記録されること。


応用編

複数サーバへの同期

複数サーバへの同期が必要な場合、1つのスクリプトで複数の接続を扱える。

option batch on
option confirm off

# サーバA
open sftp://deploy@server-a.example.com -privatekey="C:\Users\username\.ssh\id_rsa.ppk"
sync remote -delete C:\Users\username\Documents\project /home/deploy/product
close

# サーバB
open sftp://admin@server-b.example.com -privatekey="C:\Users\username\.ssh\id_rsa.ppk"
sync remote -delete C:\Users\username\Documents\project /var/www/html
close

exit

ダウンロード方向の同期(サーバ→ローカルバックアップ)

サーバのデータをローカルにバックアップする場合は sync local を使う。

option batch on
option confirm off
open sftp://backup@192.168.1.100 -privatekey="C:\Users\username\.ssh\id_rsa.ppk"

sync local C:\Backup\server-data /var/www/html

exit

Windows起動時に自動でリアルタイム同期を開始

keepuptodate を使ったスクリプトをWindowsのスタートアップに登録すると、PC起動時に自動でリアルタイム同期が始まる。

  1. Win + R キーで「ファイル名を指定して実行」を開く
  2. shell:startup と入力してスタートアップフォルダを開く
  3. 先ほど作成したバッチファイルのショートカットをここに配置

トラブルシュート

このガイドを進める中でよくある問題と解決策。

症状 原因 解決策
Host is not known エラー サーバのホスト鍵が未登録 GUIでWinSCPを起動して一度手動接続しホスト鍵を受け入れる。または open ... -hostkey="..." でホスト鍵を指定
Password authentication failed パスワードが間違っている / 公開鍵設定ミス GUIで接続確認。PPKファイルのパスが正しいか確認
Access denied でファイルが転送できない サーバ側のパーミッション不足 転送先ディレクトリに書き込み権限があるかサーバ側で確認
同期後にファイルが消える -delete オプションが意図しない削除をしている まず -delete なしで実行してから確認。または sync の方向を確認
タスクスケジューラで実行されない バッチファイルのパスが間違っている / 権限設定 タスクスケジューラの「操作」タブでパスを絶対パスで指定。「開始」フィールドにバッチファイルのディレクトリも指定
PPKファイルが見つからないエラー 秘密鍵のパスに日本語・スペースが含まれている パスをダブルクォートで囲む。または英数字のみのパスに移動する

まとめ

このガイドでは、WinSCPのコマンドラインモードを使ったディレクトリ自動同期について以下の手順で解説した。

  • ステップ1: スクリプトファイルの作成(syncコマンドの基本構文、filemaskの設定)
  • ステップ2: 動作確認とSSH公開鍵認証の設定、ショートカット作成
  • ステップ3: keepuptodateコマンドによるリアルタイム監視設定
  • ステップ4: Windowsタスクスケジューラへの登録で完全自動化

WinSCPのスクリプト機能を活用することで、手動でのファイル転送作業を完全に排除できる。開発環境でのデプロイ自動化や、定期バックアップの仕組みとして積極的に活用してほしい。

次のステップとして、ファイル同期に留まらずLinuxサーバ上のコマンド実行まで自動化したい場合はSSHスクリプトも合わせて検討するとよい。


関連記事

WindowsWinSCP

Posted by GENDOSU