WinSCPの自動化方法|winscp.com・get/putとバッチ実行
掲載日:
更新日:
INFORMATION > WinSCPの自動化方法|winscp.com・get/putとバッチ実行
結論:WinSCPのSFTP転送は、コンソール版のwinscp.comへopen・get・put・exitを記述したスクリプトファイルを渡すことで自動化できます。Windowsバッチから実行し、終了コードとログを確認すれば転送失敗も検知できます。
この記事の対象と位置付け:GUIで行っていたWinSCP転送を、Windowsのコマンドプロンプトやタスクから再現したい方向けです。
2026年時点の注意:接続先のSSHホスト鍵を事前に検証し、パスワードをバッチへ平文保存しないでください。複雑な分岐や再試行が必要な処理では、WinSCP公式が推奨する.NET Assemblyも検討してください。
概要
WinSCPにはGUI版のWinSCP.exeだけでなく、コマンドプロンプトやWindowsバッチから利用できるコンソール版のWinSCP.comがあります。本記事では、スクリプトファイルに接続と転送のコマンドを記述し、Linuxサーバー上のファイルをgetでダウンロードする例と、putでアップロードする例を説明します。既存のコード例は作成当時の構成を残し、2026年時点で必要なログ、戻り値、ホスト鍵、認証情報の注意点を本文で補足します。
1. winscp.comとWinSCPコマンドとは?
winscp.comは、GUIで行う接続やファイル転送をスクリプトから実行するためのWinSCPコンソールツールです。WinSCPのインストール先にあるwinscp.comを直接起動するか、Windowsバッチからスクリプトファイルを指定して実行します。
1-1. できること
以下のサイトに記載されているコマンドの実行が可能です。
ファイルのダウンロードやアップロード、フォルダ操作、リモート側コマンドの呼び出しなどを自動化できます。基本の流れで使うコマンドは次の4つです。
- open:SFTPなどのセッションを開始します。無人実行では、接続先の正しいSSHホスト鍵を事前に確認して指定します。
- get:リモート側のファイルをローカルへダウンロードします。転送元にはワイルドカードを指定でき、転送先をフォルダとして指定する場合は末尾のバックスラッシュが必要です。空白を含むパスは引用符で囲みます。
- put:ローカル側のファイルをリモートへアップロードします。getとは転送方向が逆です。
- exit:スクリプトを終了します。WinSCPは、コマンドがエラーで中断された場合に終了コード1、正常終了時に0を返すため、呼び出し元のバッチで成否を判定できます。
1-2. できないこと
基本的なファイルのダウンロードやアップロードは可能ですが、使ってみて、細かい部分の制御は難しそうです。
例えば、「ファイルの更新日を確認して指定の更新日のファイルを取ってくる」みたいなことは難しそうでした。
操作するファイルに複雑な条件を付けたい時は「call」コマンドでシェルを呼び出せばWindowsのコマンド、Linuxのコマンドなどを使って実現が可能だと思います。
2. getコマンドで自動ダウンロード
Linuxサーバー上のログをgetコマンドでWindowsへ自動ダウンロードする例を確認します。スクリプトファイルには接続、転送、切断を記述し、Windowsバッチからwinscp.comへ渡します。
2-1. 作成
以下の条件でツールを作成します。
・実行環境がWindows10
・取得先サーバがLinux
・IPアドレスが192.168.50.10
まず、起動の起点となるbatファイルを作成します。
@setlocal enabledelayedexpansion
@set time2=%time: =0%
@set MKDIR_NAME=%date:~0,4%%date:~5,2%%date:~8,2%%time2:~0,2%%time2:~3,2%%time2:~6,2%
@set FOLDER=%~dp0%MKDIR_NAME%
@mkdir %FOLDER%
@"C:\Program Files (x86)\WinSCP\WinSCP.com" /console /script=%~dp0ftp.txt /parameter %FOLDER%
最後の行以外はWindowsコマンドの処理です。内容を説明すると
@setlocal enabledelayedexpansion
遅延環境変数のための設定です。簡単に説明すると、変数に値を設定しても反映されないことがあるのを防ぐ記述です。
@set time2=%time: =0%
@set MKDIR_NAME=%date:~0,4%%date:~5,2%%date:~8,2%%time2:~0,2%%time2:~3,2%%time2:~6,2%
@set FOLDER=%~dp0%MKDIR_NAME%
現在時刻からyyyymmddhmmssを取得して最終的にFOLDER変数に入れる処理です。
@mkdir %FOLDER%
バッチを実行したフォルダ直下に「yyyymmddhmmss」のフォルダを作成します。
@"C:\Program Files (x86)\WinSCP\WinSCP.com" /console /script=%~dp0ftp.txt /parameter %FOLDER%
「WinSCP.com(WinSCPコマンド)」を実行します。実行内容はバッチファイルが格納されている同一フォルダにある、「ftp.txt」に記載されているコマンドを実行します。引数として先程作成したフォルダパスを渡します。
定期実行へ組み込む場合は、公式の/logオプションでセッションログを保存し、実行後にWinSCPの終了コードを確認します。画面を開かない処理では、成功時にファイルが存在することだけでなく、終了コードとログの両方を監視すると原因を追いやすくなります。
これで、呼び出し元のファイルの作成は完了です。続いて、WinSCPコマンドを「ftp.txt」に記載していきます。
option batch on
option transfer binary
open test:testpassword@192.168.50.10
get /var/log/httpd/access_log %1%\
close
exit
内容を説明すると
option batch on
問い合わせが必要な処理については自動的に「いいえ」が選択されたものとして自動実行させます。これを入れるとファイル名が重複した時は自動で上書きをしてくれます。 (「yyyymmddhmmss」のフォルダを作ってそこに入れるのでファイル名が重複することはありませが。)
option transfer binary
バイナリーモードで転送する設定となります。
open test:testpassword@192.168.50.10
「ユーザ名:パス―ワード@IPアドレス」となります。IPアドレス「192.168.50.10」に対して、接続します。
get /var/log/httpd/access_log %1%\
getの第1引数「/var/log/httpd/access_log」がリモート側の転送元、第2引数「%1%\」がローカル側の保存先です。「%1%」にはfile_get.batから作成済みフォルダのパスが渡され、末尾のバックスラッシュによって保存先がフォルダであることを示します。
転送元にはワイルドカードを利用できるため、「/var/log/httpd/*」のように指定すると、そのディレクトリ内で一致する複数ファイルを取得できます。必要以上のファイルを転送しないよう、対象名と保存先を実行前に確認してください。
close
exit
切断処理となります。
以上でツールの作成は完了となります。
2-2. 実行準備
実行前に事前にフィンガープリントの確認を行います。
WinSCPで初回接続時に以下の様な画像が表示されると思います。
こちらは、一度も接続したことがないサーバの場合に、接続して問題ないかの確認となります。「はい」を押下するとWindowsのレジストリ領域というところに「はい」と押した記録が残ります。これにより2回目以降は確認されない仕組みとなっています。ツールを実行する際は事前にこちらの作業を行い、接続しても問題ないサーバであることの情報をレジストリ領域に保存する必要があるためコマンドプロンプトで以下のコマンドを実行します。(WinSCPのツールから1度接続するのでもOKです。)
"C:\Program Files (x86)\WinSCP\WinSCP.com"
open test:testpassword@192.168.50.10 ⇒応答を求めらるので「y」を入力
close
exit
exit
「test:testpassword@192.168.50.10」は「ユーザ名:パス―ワード@IPアドレス」に読み替えてください。
安全上の注意:上の接続例は旧記事の動作説明用です。実運用ではパスワードをスクリプトへ平文保存せず、公開鍵認証などを利用してください。また、単に初回確認へ応答するのではなく、管理者から入手したSHA-256形式のSSHホスト鍵フィンガープリントと照合し、接続先が正しいことを確認します。
これで事前準備は完了となります。
2-3. 実行
いよいよ実行です。「file_get.bat」をダブルクリックします。
「yyyymmddhhmmss」のフォルダが作成されてフォルダの中にログが格納されていれば成功です。
3. 自動アップロードツール
次は、Linuxサーバにファイルを置くツールを作成していきたいと思います。基本的な作りはダウンロードツールと同じになります。
3-1. 作成
以下の条件でツールを作成します。
・実行環境がWindows10
・格納先サーバがLinux
・IPアドレスが192.168.50.10
まず、起動の起点となるbatファイルを作成します。
@setlocal enabledelayedexpansion
@set FOLDER_NAME="put_files\*"
@set FOLDER=%~dp0%FOLDER_NAME%
@set PUT_FOLDER="/tmp/"
@"C:\Program Files (x86)\WinSCP\WinSCP.com" /console /script=%~dp0put_ftp.txt /parameter %FOLDER% %PUT_FOLDER%
自動ダウンロードツールのところでも説明しているので、少し説明を省略しますが、バッチファイルを実行する同じフォルダ内にある「put_files」フォルダにあるファイルを「/tmp/」に格納する処理となります。実際に格納する処理は「put_ftp.txt」に記述していきます。
option batch on
option transfer binary
open test:testpassword@192.168.50.10
put %1% %2%
close
exit
こちらも、自動ダウンロードツールのところでも説明しているので、少し説明を省略しますが「put %1%\ %2%」のコマンドにより引数で渡された「格納元ファイル」「格納先フォルダ」によりファイルをアップロードします。
3-2. 実行準備
自動ダウンロードツールと同じく、実行前に事前にフィンガープリントの確認を行います。(自動ダウンロードツールで一度実行している場合は不要です。)
コマンドプロンプトで以下のコマンドを実行します。(WinSCPのツールから1度接続するのでもOKです。)
"C:\Program Files (x86)\WinSCP\WinSCP.com"
open test:testpassword@192.168.50.10 ⇒応答を求めらるので「y」を入力
close
exit
exit
「test:testpassword@192.168.50.10」は「ユーザ名:パス―ワード@IPアドレス」に読み替えてください。
これで事前準備は完了となります。
3-3. 実行
いよいよ実行です。「file_put.bat」をダブルクリックします。
「/tmp/」フォルダに「put_files」に格納したファイルが転送されていれば成功です。
4. その他よく使いそうなコマンド
基本的なダウンロードとアップロードは紹介しましたが、その他よく使いそうなコマンドも記載したいと思います。
4-1. 鍵認証
先ほどは以下の記述によりパスワード認証でログインしました。
open test:testpassword@192.168.50.10
「open ユーザ名:パスワード@IPアドレス」となります。鍵認証の場合は以下となります。
open test@192.168.50.10 -privatekey=id_rsa.ppk
「-privatekey=id_rsa.ppk」は鍵のパスとなります。相対パスで記載しているため、実行ファイル(batファイル)があるフォルダに鍵(id_rsa.ppk)もある前提となっています。例えばCドライブ直下に鍵がある場合は「-privatekey=C:\id_rsa.ppk」と書きます。
4-2. シェルの呼び出し
WinSCPコマンドによりシェルを呼び出す場合は以下の様に記述します。
option batch on
option transfer binary
open test:testpassword@192.168.50.10
call sh /tmp/test.sh
close
exit
「call sh /tmp/test.sh」により「test.sh」が実行されます。引数を渡すことも可能です。引数を渡すときは「call sh /tmp/test.sh hikisu1」の様にして書きます。
5. まとめ
WinSCPの定期転送は、winscp.comへopen、getまたはput、exitを記述したスクリプトを渡すことで自動化できます。getではリモート側の転送元とローカル側の保存先を明確にし、フォルダ末尾のバックスラッシュや空白を含むパスの引用符に注意してください。
無人実行では、SSHホスト鍵の照合、認証情報の安全な管理、セッションログの保存、終了コードによるエラー判定までを一組として設計します。より多くのコマンド例やバッチ実行の整理は、下の関連記事も参照してください。


