
WinSCPでディレクトリを自動同期する方法【スクリプト・スケジュール実行対応】【2025年版】
WinSCPはGUIでのSFTP/FTPファイル転送ツールとしてよく知られているが、コマンドラインモード(WinSCP.com)を使うとスクリプトによる自動同期が実現できる。
このガイドを完了すると、以下のことができるようになる。
- WinSCPスクリプトでWindowsフォルダ ↔ Linuxサーバのディレクトリを双方向同期
keepuptodateコマンドによるリアルタイム監視・自動転送- Windowsタスクスケジューラで定期バックアップ・同期を完全自動化
- 特定のファイル・フォルダを除外するフィルタリング設定
実際にWinSCP 6.xで動作確認済みの手順を掲載している。

前提条件
このガイドを進める前に、以下の環境・知識が必要。
- 環境: Windows 10 / 11
- 必要なツール: WinSCP(5.x以降、最新版推奨) — 公式サイトからダウンロード
- 接続先: SSH/SFTPが有効なLinuxサーバ(または FTPサーバ)
- 前提知識: Windowsのコマンドプロンプト基本操作、SSHの基礎
# WinSCP.comのバージョン確認(コマンドプロンプトで実行)
"C:\Program Files (x86)\WinSCP\WinSCP.com" /help
なくてもOK: 管理者権限。一般ユーザ権限でも動作する。タスクスケジューラへの登録は一般ユーザ権限でも可能。
全体の流れ
このガイドは以下の4ステップで構成されている。
- WinSCPスクリプトファイルの作成 — 5分
- スクリプトの動作確認とオプション詳解 — 10分
- リアルタイム監視(keepuptodate)の設定 — 5分
- タスクスケジューラで定期自動実行 — 10分

ステップ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 ローカルパス リモートパス # 双方向同期(新しいほうを優先)

✅ ステップ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ファイルとして保存。
ショートカットファイルで簡単実行
毎回コマンドプロンプトを開くのは手間なので、デスクトップにショートカットを作成する。
- デスクトップで右クリック → 「新規作成」→「ショートカット」
- 場所に以下を入力:
"C:\Program Files (x86)\WinSCP\WinSCP.com" /script="C:\Users\username\Documents\winscp-sync.txt" - 名前を「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
keepuptodate は sync と同様のオプションを持つが、一度実行すると終了せず監視状態を維持する。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

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

タスクの動作確認
登録後、右クリック→「実行」で即時実行してテストできる。ログファイル(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起動時に自動でリアルタイム同期が始まる。
Win + Rキーで「ファイル名を指定して実行」を開くshell:startupと入力してスタートアップフォルダを開く- 先ほど作成したバッチファイルのショートカットをここに配置
トラブルシュート
このガイドを進める中でよくある問題と解決策。
| 症状 | 原因 | 解決策 |
|---|---|---|
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スクリプトも合わせて検討するとよい。


