【bat】WinSCPでSFTPファイル送受信を自動化する完全ガイド|スクリプト実行・公開鍵認証・同期・エラー処理・実践例まで徹底解説

【bat】WinSCPでSFTPファイル送受信を自動化する完全ガイド|スクリプト実行・公開鍵認証・同期・エラー処理・実践例まで徹底解説 bat

バッチファイルからSFTPでファイルを自動転送したい。そのような要件では WinSCP を使うのがWindowsでの定番の方法です。WinSCPはGUI操作だけでなくコマンドラインから完全スクリプト実行ができるため、バッチファイルとの組み合わせで日次アップロード・定期ダウンロード・フォルダ差分同期といった処理を簡単に自動化できます。Windowsに標準の ftp コマンドと異なり、通信が暗号化され、ERRORLEVEL も確実に返るため、FTPからの移行先としても最適です。この記事では、インストールから接続・転送・同期・公開鍵認証・エラー処理まで、実践例3本とともに体系的に解説します。

この記事でわかること

  • WinSCP.com(コマンドライン版)の基本的な使い方
  • WinSCPスクリプトファイルの書き方とバッチからの動的生成
  • アップロード(put)・ダウンロード(get)の基本パターン
  • synchronize コマンドによる差分同期(WinSCP最大の強み)
  • 公開鍵認証でパスワードなしの安全な自動化
  • ERRORLEVEL を使った確実なエラー処理
  • ホスト鍵フィンガープリントの検証設定
  • 実践例3本(日次アップロード・定期ダウンロード・双方向同期)
スポンサーリンク

1. WinSCP とは・コマンドライン版(WinSCP.com)の仕組み

WinSCP は Windows 向けの無料SFTPクライアントです。GUI操作のほかに、WinSCP.com(コマンドライン版)が同梱されており、スクリプトファイルを渡すことで完全なヘッドレス自動実行ができます。

ファイル 用途 備考
WinSCP.exe GUIアプリケーション 通常の対話操作用
WinSCP.com コマンドライン版 バッチ自動化はこちらを使う

インストール先は通常 C:\Program Files (x86)\WinSCP\ または C:\Program Files\WinSCP\ です。ポータブル版(インストール不要)もあるため、サーバー環境ではWinSCP.com 単体をシステムに配置して使うことも可能です。

:: WinSCP.com のパスを変数に設定しておく
set "WINSCP=C:\Program Files (x86)\WinSCP\WinSCP.com"

:: インストール確認
if not exist "%WINSCP%" (
    echo [ERROR] WinSCP.com が見つかりません: %WINSCP%
    echo WinSCP をインストールしてください: https://winscp.net/
    exit /b 1
)

2. WinSCP スクリプトファイルの基本構文

WinSCP のスクリプトファイルは、1行ずつコマンドを並べたテキストファイルです。基本の流れは 接続 → 操作 → 切断 の3ステップです。

# ─── WinSCPスクリプトの基本構造 ────────────────────
option batch abort          # エラー時に中断する
option confirm off          # 上書き確認を抑制
option transfer binary      # バイナリ転送モード

# ─── サーバーに接続 ──────────────────────────────────
open sftp://username:password@ftp.example.com:22/

# ─── ローカルフォルダを移動 ──────────────────────────
lcd C:\work\data

# ─── サーバー側フォルダを移動 ───────────────────────
cd /upload/data

# ─── ファイルをアップロード ──────────────────────────
put data.csv

# ─── 接続を閉じる ────────────────────────────────────
close
exit
スクリプトコマンド 意味 主な引数例
option batch abort エラー時に即中断 abort / continue
option confirm off 上書き確認を抑制 off / on
option transfer binary バイナリ転送 binary / ascii / automatic
open sftp://... SFTP接続 URL形式で認証情報を指定
lcd パス ローカルフォルダ移動 lcd C:\work
cd パス サーバー側フォルダ移動 cd /remote/upload
put ファイル [リモート名] アップロード put data.csv
get リモートファイル [ローカル名] ダウンロード get report.csv
synchronize 差分同期 後述(WinSCPの強み)
mkdir リモートパス サーバー側フォルダ作成 mkdir /upload/2025
rm リモートファイル サーバー側ファイル削除 rm old.csv
ls [リモートパス] サーバー側ファイル一覧 ls /upload/
close 接続を閉じる
exit WinSCPを終了

3. バッチからWinSCPスクリプトを実行する方法

3-1. スクリプトファイルを動的生成してWinSCPに渡す

スクリプトファイルをあらかじめ固定で用意する方法もありますが、バッチで動的に生成する方法が実務では一般的です。日付付きファイル名を転送対象にしたり、接続先を環境変数から切り替えたりできます。

@echo off

:: ─── 設定 ──────────────────────────────────────────────────
set "WINSCP=C:\Program Files (x86)\WinSCP\WinSCP.com"
set "SFTP_HOST=sftp.example.com"
set "SFTP_USER=ftpuser"
set "SFTP_PASS=mypassword"
set "SFTP_PORT=22"
set "REMOTE_DIR=/upload/data"
set "LOCAL_FILE=C:\work\data.csv"

:: ─── スクリプトファイルを一時フォルダに動的生成 ──────────
set "SCRIPT=%TEMP%\winscp_%RANDOM%.txt"
(
    echo option batch abort
    echo option confirm off
    echo option transfer binary
    echo open sftp://%SFTP_USER%:%SFTP_PASS%@%SFTP_HOST%:%SFTP_PORT%/
    echo cd %REMOTE_DIR%
    echo put "%LOCAL_FILE%"
    echo close
    echo exit
) > "%SCRIPT%"

:: ─── WinSCP実行 ────────────────────────────────────────────
"%WINSCP%" /script="%SCRIPT%"
set "RC=%ERRORLEVEL%"

:: ─── スクリプト削除(パスワード漏えい防止) ──────────────
del "%SCRIPT%" >nul 2>&1

if "%RC%"=="0" (
    echo [OK] アップロード完了
) else (
    echo [ERROR] アップロード失敗 ERRORLEVEL=%RC%
    exit /b 1
)
pause
WinSCP は ERRORLEVEL が確実 — FTP との最大の違い
Windows標準の ftp.exe は失敗しても ERRORLEVEL が 0 を返すことが多く、成否の判定にログ解析が必要でした。WinSCP は 成功=0・失敗=1 を確実に返すため、if ERRORLEVEL 1 ... で直接エラー処理できます。これがバッチ自動化でWinSCPを使う大きなメリットです。

3-2. /command オプションで直接コマンドを渡す方法

スクリプトファイルを作らずに、/command オプションでコマンドを直接渡す方法もあります。単純な1〜2ステップの処理に向いています。

@echo off

set "WINSCP=C:\Program Files (x86)\WinSCP\WinSCP.com"
set "SFTP_HOST=sftp.example.com"
set "SFTP_USER=ftpuser"
set "SFTP_PASS=mypassword"

:: ─── /command で直接コマンドを渡す ────────────────────────
"%WINSCP%" /command ^^
    "option batch abort" ^^
    "option confirm off" ^^
    "open sftp://%SFTP_USER%:%SFTP_PASS%@%SFTP_HOST%:22/" ^^
    "put C:\work\data.csv /upload/data/" ^^
    "close" ^^
    "exit"

if %ERRORLEVEL% neq 0 (
    echo [ERROR] SFTP失敗
    exit /b 1
)
echo [OK] 完了
pause

4. ファイルをアップロードする(put)

4-1. 単一ファイルのアップロード

# WinSCPスクリプト内での put の書き方

# ─── 単一ファイル ───────────────────────────────────
put C:\work\data.csv

# ─── リモート名を変えてアップロード ─────────────────
put C:\work\data.csv /upload/data_2025.csv

# ─── スペースを含むパスはダブルクォートで囲む ───────
put "C:\My Folder\report.xlsx" /upload/report.xlsx

# ─── フォルダごとアップロード(再帰的) ─────────────
put -r "C:\work\data" /upload/data/

4-2. ワイルドカードで複数ファイルをアップロード

# ─── *.csv を全てアップロード ───────────────────────
put C:\work\*.csv /upload/csv/

# ─── 日付ファイルのみアップロード(-filemask 使用) ─
# 例: report_20250414.csv のような名前のファイルのみ
put -filemask=*_????????.csv C:\work\ /upload/

# ─── アップロード後にローカルファイルを削除 ─────────
put -delete C:\work\*.csv /upload/
put のパス指定:末尾スラッシュの有無に注意
リモートパスの末尾にスラッシュ / があると「そのフォルダの中に置く」、なければ「そのファイル名で置く」という意味になります。put data.csv /upload//upload/data.csv(推奨)
put data.csv /upload/upload というファイルが作られる可能性あり

5. ファイルをダウンロードする(get)

# ─── 単一ファイルのダウンロード ────────────────────
get /download/latest.csv C:\work\received\

# ─── ワイルドカードで複数ファイルをダウンロード ─────
get /download/*.csv C:\work\received\

# ─── サブフォルダごと再帰的にダウンロード ──────────
get -r /download/data/ C:\work\received\

# ─── ダウンロード後にリモートファイルを削除 ─────────
get -delete /download/*.csv C:\work\received\

get の引数は get リモートパス ローカルパス の順です。ローカルパスの末尾にバックスラッシュ(\)を付けると「そのフォルダの中に同名で保存」という意味になります。ダウンロード先フォルダが存在しない場合は、事前に mkdir で作成しておく必要があります。IF EXISTでフォルダ存在確認をする方法も参照してください。

6. synchronize コマンドによる差分同期(WinSCP 最大の強み)

WinSCPの synchronize コマンドは、ローカルとリモートの差分だけを転送する強力な機能です。変更されたファイルや新規ファイルのみを転送するため、毎回全ファイルを転送する put / get より効率的です。

# ─── synchronize の基本構文 ─────────────────────────
# synchronize 方向 ローカルパス リモートパス [オプション]
#                  ↑ローカルが先 ↑リモートが後

# ローカル → リモートへ同期(アップロード)
synchronize remote C:\work\data /upload/data

# リモート → ローカルへ同期(ダウンロード)
synchronize local C:\work\received /download/data

# 双方向同期(新しいほうで上書き)
synchronize both C:\work\sync /share/data
方向 コマンド 動作
remote(アップロード) synchronize remote C:\local /remote ローカルの変更・新規ファイルをリモートに転送。リモートの古いファイルを更新
local(ダウンロード) synchronize local C:\local /remote リモートの変更・新規ファイルをローカルに取得。ローカルの古いファイルを更新
both(双方向) synchronize both C:\local /remote 新しいほうで古いほうを上書き更新(双方向)

6-1. synchronize の便利なオプション

# ─── よく使うオプション ─────────────────────────────

# -delete: リモートに存在しないローカルファイルをリモートから削除
synchronize remote -delete C:\work\data /upload/data

# -mirror: 完全ミラー(削除も含む双方向完全一致)
synchronize remote -mirror C:\work\data /upload/data

# -criteria=size: ファイルサイズで比較(タイムスタンプでなくサイズ差分で同期)
synchronize remote -criteria=size C:\work\data /upload/data

# -filemask: 特定パターンのファイルのみ同期
synchronize remote -filemask=*.csv C:\work\csv /upload/csv

# -preview: 実際に転送せずに差分を確認のみ(dry-run)
synchronize remote -preview C:\work\data /upload/data
synchronize -delete がバックアップ運用の定番
synchronize remote -delete は「ローカルに存在するファイルのみをリモートに保持」する動作です。ローカルから削除したファイルはリモートからも削除されるため、完全なミラーバックアップが実現できます。定期バックアップや、フォルダをコピーして同期する運用の代替として非常に有効です。

7. 公開鍵認証でパスワードなしの安全な自動化

パスワードをスクリプトファイルに書く方法は、ファイルの権限管理が不十分だと漏えいリスクがあります。公開鍵認証(SSH鍵認証)を使えば、パスワードをファイルに書く必要がなくなり、最も安全な自動化が実現できます。

7-1. 秘密鍵をWinSCPに登録して使う方法

OpenSSHの .pem や PuTTY形式の .ppk ファイルを使います。WinSCPはPuTTY形式(.ppk)を直接使えます。OpenSSH形式(.pem)はWinSCP付属の puttygen.exe で変換してください。

@echo off

set "WINSCP=C:\Program Files (x86)\WinSCP\WinSCP.com"
set "SFTP_HOST=sftp.example.com"
set "SFTP_USER=ftpuser"
set "PRIVATE_KEY=C:\ssh_keys\mykey.ppk"

:: ─── 鍵ファイルの存在確認 ──────────────────────────────────
if not exist "%PRIVATE_KEY%" (
    echo [ERROR] 秘密鍵ファイルが見つかりません: %PRIVATE_KEY%
    exit /b 1
)

set "SCRIPT=%TEMP%\winscp_%RANDOM%.txt"
(
    echo option batch abort
    echo option confirm off
    echo option transfer binary
    echo :: privatekey でパスワードなしに接続
    echo open sftp://%SFTP_USER%@%SFTP_HOST%:22/ -privatekey="%PRIVATE_KEY%"
    echo put "C:\work\data.csv" /upload/
    echo close
    echo exit
) > "%SCRIPT%"

"%WINSCP%" /script="%SCRIPT%"
set "RC=%ERRORLEVEL%"
del "%SCRIPT%" >nul 2>&1

if "%RC%"=="0" ( echo [OK] 完了 ) else ( echo [ERROR] 失敗 ERRORLEVEL=%RC% && exit /b 1 )
pause
秘密鍵がパスフレーズ保護されている場合
秘密鍵にパスフレーズが設定されている場合、バッチ実行時に入力を求められます。完全無人実行のためには パスフレーズなしの鍵を使うか、Pageant(PuTTYの鍵エージェント)に鍵を登録してから実行します。セキュリティと利便性のバランスを考慮して設計してください。

8. ホスト鍵フィンガープリントの検証と設定

SFTPの最初の接続時は「このサーバーを信頼するか?」というホスト鍵の確認ダイアログが出ます。バッチで自動実行する場合は、この確認をスキップするか、フィンガープリントを事前に指定して中間者攻撃(MITM)を防ぐ必要があります。

8-1. フィンガープリントを指定して接続する(推奨)

# フィンガープリントを -hostkey オプションで指定
# フィンガープリントは事前にサーバー管理者から取得するか、
# WinSCP GUIで一度接続して確認する

open sftp://user:pass@sftp.example.com:22/ -hostkey="ssh-rsa 2048 xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx"

# SHA-256 形式でも指定できる(より安全)
open sftp://user:pass@sftp.example.com:22/ -hostkey="ssh-rsa 2048 AbCdEf1234567890=="

8-2. フィンガープリントを確認する方法

:: WinSCP.com でフィンガープリントを確認
:: /fingerprintscanhostkey オプションで取得できる
"C:\Program Files (x86)\WinSCP\WinSCP.com" /fingerprintscanhostkey "sftp://sftp.example.com:22"
-hostkey=”*” は使わない
-hostkey="*" はすべてのホスト鍵を無条件に信頼するオプションです。簡単ですが、中間者攻撃(MITM攻撃)に対して無防備になります。テスト目的なら使えますが、本番環境では必ず正しいフィンガープリントを指定してください。

9. WinSCP のログ記録

WinSCP は /log= オプションでログファイルを出力できます。ログには接続情報・転送ファイル名・エラー内容が記録され、トラブルシューティングに非常に役立ちます。バッチのログ出力全般の方法も参照してください。

@echo off

set "WINSCP=C:\Program Files (x86)\WinSCP\WinSCP.com"
set "YMD=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%"
set "LOG_DIR=%~dp0logs"
set "LOG_FILE=%LOG_DIR%\winscp_%YMD%.log"
set "SCRIPT=%TEMP%\winscp_%RANDOM%.txt"

if not exist "%LOG_DIR%\" mkdir "%LOG_DIR%"

(
    echo option batch abort
    echo option confirm off
    echo option transfer binary
    echo open sftp://user:pass@sftp.example.com:22/
    echo put "C:\work\data.csv" /upload/
    echo close
    echo exit
) > "%SCRIPT%"

:: ─── /log= でログファイル、/loglevel=1 で詳細ログ ──────────
"%WINSCP%" /script="%SCRIPT%" /log="%LOG_FILE%" /loglevel=1
set "RC=%ERRORLEVEL%"
del "%SCRIPT%" >nul 2>&1

if "%RC%"=="0" (
    echo [OK] 完了。ログ: %LOG_FILE%
) else (
    echo [ERROR] 失敗 ERRORLEVEL=%RC% ログ: %LOG_FILE%
    exit /b 1
)
pause
/loglevel の値 ログの詳細度 推奨用途
/loglevel=0 最小(エラーのみ) ディスク節約重視
/loglevel=1 標準(推奨) 通常の運用ログ
/loglevel=2 詳細(デバッグ用) 問題調査時のみ

10. WinSCP GUI のセッション保存を活用する方法

WinSCP GUIで接続情報をセッションとして保存しておけば、バッチスクリプトから パスワードを書かずに接続できます。公開鍵認証が使えない環境での代替手段として有効です。

# WinSCP GUIで保存したセッション名を使う
# セッション名は WinSCP GUI の「保存済みセッション」で確認

option batch abort
option confirm off
option transfer binary

# 「保存済みセッション名」で接続
open MyServer

put "C:\work\data.csv" /upload/
close
exit
セッション保存のパスワードはレジストリに暗号化保存される
WinSCP GUIのセッション保存では、パスワードはWindowsのレジストリ(HKCU)に弱い暗号化で保存されます。管理者権限のあるユーザーには読まれる可能性があります。パスワード認証を使わざるを得ない場合でも、できる限り公開鍵認証に移行することを強く推奨します。

11. 実践例3本

実践例1:日次売上CSVをSFTPサーバーにアップロードする

タスクスケジューラで毎朝自動実行する、日次ファイルアップロードの定番テンプレートです。日付をファイル名に使う方法と組み合わせています。

@echo off
setlocal enabledelayedexpansion

:: ─── 設定 ──────────────────────────────────────────────────
set "WINSCP=C:\Program Files (x86)\WinSCP\WinSCP.com"
set "SFTP_HOST=sftp.example.com"
set "SFTP_USER=ftpuser"
set "PRIVATE_KEY=C:\ssh_keys\upload.ppk"
set "YMD=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%"
set "LOCAL_FILE=C:\work\sales\sales_%YMD%.csv"
set "LOG_DIR=%~dp0logs"
set "LOG_FILE=%LOG_DIR%\sftp_upload_%YMD%.log"

if not exist "%LOG_DIR%\" mkdir "%LOG_DIR%"

:: ─── 前提チェック ──────────────────────────────────────────
if not exist "%WINSCP%" ( echo [ERROR] WinSCP未インストール >> "%LOG_FILE%" & exit /b 1 )
if not exist "%LOCAL_FILE%" ( echo [ERROR] 対象ファイルなし: %LOCAL_FILE% >> "%LOG_FILE%" & exit /b 1 )

:: ─── WinSCPスクリプト生成 ──────────────────────────────────
set "SCRIPT=%TEMP%\winscp_!RANDOM!.txt"
(
    echo option batch abort
    echo option confirm off
    echo option transfer binary
    echo open sftp://%SFTP_USER%@%SFTP_HOST%:22/ -privatekey="%PRIVATE_KEY%"
    echo cd /upload/sales
    echo put "%LOCAL_FILE%" sales_%YMD%.csv
    echo close
    echo exit
) > "!SCRIPT!"

:: ─── 実行 ──────────────────────────────────────────────────
"%WINSCP%" /script="!SCRIPT!" /log="%LOG_FILE%" /loglevel=1
set "RC=!ERRORLEVEL!"
del "!SCRIPT!" >nul 2>&1

:: ─── 結果 ──────────────────────────────────────────────────
if "!RC!"=="0" (
    echo [%DATE% %TIME%] [OK] sales_%YMD%.csv アップロード完了 >> "%LOG_FILE%"
    echo [OK] アップロード完了
) else (
    echo [%DATE% %TIME%] [ERROR] アップロード失敗 RC=!RC! >> "%LOG_FILE%"
    echo [ERROR] 失敗。ログ: %LOG_FILE%
    exit /b 1
)
pause

実践例2:リモートサーバーから処理済みファイルを取得して削除する

リモートの処理済みフォルダからCSVをローカルに取得し、リモート側のファイルを削除して「取り込み済み」状態にするパターンです。受信確認が必要なファイル連携で使われます。

@echo off
setlocal enabledelayedexpansion

set "WINSCP=C:\Program Files (x86)\WinSCP\WinSCP.com"
set "SFTP_HOST=sftp.example.com"
set "SFTP_USER=ftpuser"
set "PRIVATE_KEY=C:\ssh_keys\download.ppk"
set "YMD=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%"
set "DOWNLOAD_DIR=C:\work\received\%YMD%"
set "LOG_FILE=%~dp0logs\sftp_download_%YMD%.log"

if not exist "%DOWNLOAD_DIR%\" mkdir "%DOWNLOAD_DIR%"
if not exist "%~dp0logs\" mkdir "%~dp0logs"

set "SCRIPT=%TEMP%\winscp_!RANDOM!.txt"
(
    echo option batch abort
    echo option confirm off
    echo option transfer binary
    echo open sftp://%SFTP_USER%@%SFTP_HOST%:22/ -privatekey="%PRIVATE_KEY%"
    echo :: -delete で取得後にリモートから削除
    echo get -delete /export/pending/*.csv "%DOWNLOAD_DIR%\"
    echo close
    echo exit
) > "!SCRIPT!"

"%WINSCP%" /script="!SCRIPT!" /log="%LOG_FILE%" /loglevel=1
set "RC=!ERRORLEVEL!"
del "!SCRIPT!" >nul 2>&1

if "!RC!"=="0" (
    echo [OK] ダウンロード完了 保存先: %DOWNLOAD_DIR%
) else (
    echo [ERROR] ダウンロード失敗 RC=!RC! ログ: %LOG_FILE%
    exit /b 1
)
pause

実践例3:ローカルフォルダをリモートと完全同期する(差分のみ転送)

synchronize remote -delete で、ローカルフォルダをリモートに完全ミラー同期する例です。変更・追加されたファイルのみ転送し、ローカルから削除されたファイルはリモートからも削除します。定期バックアップや本番デプロイに使えます。

@echo off
setlocal enabledelayedexpansion

set "WINSCP=C:\Program Files (x86)\WinSCP\WinSCP.com"
set "SFTP_HOST=sftp.example.com"
set "SFTP_USER=ftpuser"
set "PRIVATE_KEY=C:\ssh_keys\sync.ppk"
set "LOCAL_DIR=C:\web\public_html"
set "REMOTE_DIR=/var/www/html"
set "YMD=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%"
set "LOG_FILE=%~dp0logs\sftp_sync_%YMD%.log"

if not exist "%~dp0logs\" mkdir "%~dp0logs"

echo [%DATE% %TIME%] 同期開始 >> "%LOG_FILE%"

set "SCRIPT=%TEMP%\winscp_!RANDOM!.txt"
(
    echo option batch abort
    echo option confirm off
    echo open sftp://%SFTP_USER%@%SFTP_HOST%:22/ -privatekey="%PRIVATE_KEY%"
    echo :: remote方向: ローカル→リモートへ差分同期
    echo :: -delete: ローカルに存在しないリモートファイルを削除
    echo synchronize remote -delete "%LOCAL_DIR%" "%REMOTE_DIR%"
    echo close
    echo exit
) > "!SCRIPT!"

"%WINSCP%" /script="!SCRIPT!" /log="%LOG_FILE%" /loglevel=1
set "RC=!ERRORLEVEL!"
del "!SCRIPT!" >nul 2>&1

if "!RC!"=="0" (
    echo [%DATE% %TIME%] [OK] 同期完了 >> "%LOG_FILE%"
    echo [OK] 同期完了
) else (
    echo [%DATE% %TIME%] [ERROR] 同期失敗 RC=!RC! >> "%LOG_FILE%"
    echo [ERROR] 失敗。ログ: %LOG_FILE%
    exit /b 1
)
pause

12. まとめ:WinSCP バッチ チートシート

やりたいこと 記述例 備考
WinSCPを呼び出す "%WINSCP%" /script="%SCRIPT%" WinSCP.com を使う
ログを記録する /log="%LOG_FILE%" /loglevel=1 起動オプションに追加
コマンドを直接渡す "%WINSCP%" /command "open ..." "put ..." "exit" スクリプトファイル不要
パスワード認証で接続 open sftp://user:pass@host:22/ スクリプト内で使用
公開鍵認証で接続 open sftp://user@host:22/ -privatekey="key.ppk" 最も安全
セッション保存で接続 open SessionName GUIで事前保存が必要
ホスト鍵を指定 -hostkey="ssh-rsa 2048 ..." openの末尾に付加
アップロード put "local.csv" /remote/ 末尾スラッシュで宛先フォルダ指定
ダウンロード get /remote/file.csv "C:\local\" 末尾バックスラッシュでフォルダ指定
フォルダ丸ごとアップロード put -r "C:\folder" /remote/ 再帰的
転送後にファイル削除 put -delete "file.csv" /remote/ get でも使える
差分同期(アップ) synchronize remote C:\local /remote WinSCP最大の強み
差分同期(ダウン) synchronize local C:\local /remote
完全ミラー同期 synchronize remote -delete C:\local /remote 削除も同期
エラー処理 if %ERRORLEVEL% neq 0 ... 0=成功, 1=失敗(確実)

FAQ

QWinSCP と Windows 標準の ftp コマンドはどちらを使うべきですか?

A可能であれば WinSCP(SFTP)を選ぶべきです。理由は3つあります。①FTPは通信が暗号化されていない(WinSCP/SFTPはSSH暗号化)、②Windows標準のftp.exeはERRORLEVELが不安定(WinSCPは0/1が確実)、③WinSCPはsynchronizeなど高度な同期機能を持つ。レガシーシステムでFTPしか使えない場合の代替として FTPバッチの使い方もあわせて確認してください。

QWinSCP.com と WinSCP.exe の違いは何ですか?

AWinSCP.exe はGUIアプリケーションで、通常の操作に使います。WinSCP.com はコマンドライン版で、バッチからのスクリプト実行に使います。両方とも同じフォルダにインストールされます。バッチから呼び出すときは必ず WinSCP.com を使ってください。WinSCP.exe を呼び出すとGUIウィンドウが開いてしまいます。

Q初回接続時に「ホスト鍵が確認できない」エラーが出ます。

Aバッチから自動実行する場合、ホスト鍵の確認ダイアログに応答できないためエラーになります。対策は2つです。①open コマンドに -hostkey="ssh-rsa 2048 xx:xx..." でフィンガープリントを指定する(推奨)、②WinSCP GUIで一度接続して鍵をキャッシュしてからバッチを実行する。テスト目的に限り -hostkey="*" で確認をスキップすることもできますが、本番環境では使わないでください。

Qsynchronize と put の違いは何ですか?どちらを使えばよいですか?

Aput は指定したファイル・フォルダをそのまま転送します。synchronize はローカルとリモートを比較して差分のあるファイルのみを転送します。毎回全ファイルを転送したい場合は put、変更分のみを効率よく転送したい場合は synchronize を使います。バックアップや定期同期では synchronize が圧倒的に効率的です。

QWinSCP スクリプト内でエラーが出たとき処理を続けたい場合はどうしますか?

Aoption batch abort の代わりに option batch continue に変更してください。abort(デフォルト推奨)はエラー時即中断、continue はエラーが出ても処理を続けます。ただし continue の場合、エラーがあっても ERRORLEVEL が 0 を返すことがあるため、/log= でログを出力してエラーを別途確認することを推奨します。

Qタスクスケジューラでバッチを実行するとWinSCPが起動しない場合があります。

A主な原因は WinSCP.com のパスが間違っているか、タスクスケジューラの「開始する場所」が設定されていないことです。バッチ内で WinSCP.com のフルパスを変数に設定し、if not exist "%WINSCP%" で起動前に存在確認を入れてください。またタスクスケジューラ側で「最上位の特権で実行する」が必要な場合もあります。