WinSCP の機能で FTP/FTPS ディレクトリ同期をバッチ実行する方法

🍪この記事の内容:
  • WinSCP の機能で FTP/FTPS ディレクトリ同期をバッチ実行するスクリプトを幾つか示す。
    • WinSCP のコマンドで同期するバッチファイル (プレビューと同期のいずれかを実行)。
    • WinSCP の .NET アセンブリで同期する PowerShell スクリプト (プレビューも同期も実行)。
Windows マシンとリモート FTP サーバをディレクトリ同期するには、WinSCP の GUI で FTP サーバに接続し、メニューの「コマンド」から「同期」を選択すればよい。が、WinSCP はコマンドラインインタフェースも提供しており [1]、これを使ったバッチファイルを書けば叩くだけでファイル同期できて便利である。

ただ、このバッチファイルでは 1 回の接続でプレビューの確認と同期の両方をすることができない (ユーザ確認を待機できる WinSCP コマンドがないため)。そのため、本番の同期前に予め差分を確認したいときはパスワード入力が 2 回必要になり面倒である (無論、パスワードのベタ書きや平文保持をすれば入力は不要になるがセキュリティ上推奨されない)。この課題は PowerShell から WinSCP の .NET アセンブリ [2] を使用すると解消できる。この場合は FTP サーバに接続して何を実行するかを柔軟に記述できる。

参考文献

  1. Scripting and Task Automation :: WinSCP, , 2025年12月6日参照.
  2. WinSCP .NET Assembly and COM Library :: WinSCP, , 2025年12月6日参照.

WinSCP のコマンドで FTPS ディレクトリ同期するバッチファイル (1 回の接続でプレビューと同期のいずれかを実行)

以下のバッチファイルはローカルとリモートの差分をプレビューする。-preview を取り除いて実行すると同期する。実行時に WinSCP にパスワードの入力を促される。

@echo off
"C:\Program Files (x86)\WinSCP\WinSCP.com" /log=%~dp0"log.txt" /ini=nul /command ^
  "open ftps://{FTPアカウント}@{FTPサーバ名} -explicit -rawsettings Utf=1" ^
  "synchronize remote "%~dp0"site /home/{FTPアカウント}/www -preview" ^
  "exit"
pause
  • なお、上記の ftps://{FTPアカウント}@{FTPサーバ名} の箇所を ftps://{FTPアカウント}:{パスワード}@{FTPサーバ名} にすればパスワードを訊かれなくなる。が、セキュリティ上、バッチファイルにパスワードを書き込むことは推奨されない。

WinSCP の .NET アセンブリで FTPS ディレクトリ同期する PowerShell スクリプト (1 回の接続でプレビューも同期も実行)

以下の PowerShell スクリプトはパスワード入力を促した後、1 回の接続でプレビューも同期もする。自分で接続を管理するため一旦パスワードを受け取っているが、-AsSecureString にしているので、画面上伏字になり、平文では保持されない。接続時に平文にコンバートし削除している。