Just another IT site ※IT系の記事は当方環境での実施内容となるため実施する場合は自己責任でお願いいたします。At Your Own Risk!! TURN BACK WHILE YOU CAN
PR

WinSCPスクリプト

※IT系の記事は当方環境での実施内容となるため実施する場合は自己責任でお願いいたします。スクリプトはAI生成のものも多いのでコピー&ペーストの際は文字コードに注意ください!
スポンサーリンク
バッチ処理の自動化スキルは市場価値が高いです。今の自分の単価を調べてみませんか?
顧客常駐はもう嫌だ!社内SEへ転職するなら【社内SE転職ナビ】
Cursor・Claude Code・Codex AIスキルを学ぶなら
環境構築不要!AIエージェント開発を非エンジニアでも即実践【AI Agent Camp】

WinSCPスクリプト

共通

option batch on
option confirm on

open username:password@servername(:PORTNO) ←(:PORTNO)はデフォルトの場合、省略可。

cd /hoge
option transfer binary

取得処理

close

exit

スクリプトファイル内のコメント

行頭に「#」

getコマンドの除外

get -filemask=|b.* * C:\Users\hoge\Documents\winscp-test\
⇒全てのファイルを対象にするが、b.で始まるファイルは除外する
a.txt                     |           55 B |    0.0 KB/s | binary | 100%
a.log                     |            0 B |    0.0 KB/s | binary |   0%

get -filemask=|a.* *.log C:\Users\hoge\Documents\winscp-test\
⇒.logで終わるファイルを対象とし、かつa.*で始まるファイルは除外する
b.log                     |            0 B |    0.0 KB/s | binary |   0%

get -filemask="|aaaa0095*;aaaa0096" *.log C:\Users\hoge\Documents\winscp-test\
⇒aaaa0096,aaaa0097で始まるファイル名以外の.logファイルを取得する
aaaa0097.log | 0 B | 0.0 KB/s | binary | 0%

get  get -filemask="|aaaa0095*;aaaa0096*;bbbb/" * C:\Users\hoge\Documents\winscp-test\
⇒aaaa0096,aaaa0097で始まるファイル名及びbbbbディレクトリとその配下以外の.logファイルを取得する
 この場合、bbbbディレクトリ配下に合致するファイルがあったとしても取得されない
winscp> ls bbbb
-rw-rw-r-- 1 hoge hoge 0 Apr 22 11:04:49 2024 aaaa0096.log
drwxrwxr-x 3 hoge hoge 4096 Apr 22 11:05:11 2024 ..
drwxrwxr-x 2 hoge hoge 4096 Apr 22 11:04:49 2024 .
-rw-rw-r-- 1 hoge hoge 0 Apr 22 11:04:49 2024 aaaa0095.log
-rw-rw-r-- 1 hoge hoge 0 Apr 22 11:04:49 2024 aaaa0097.log

aaaa0097.log | 0 B | 0.0 KB/s | binary | 0%

getコマンドのファイル格納先にフォルダを指定する場合は最後に「\」で閉じるのを忘れずに

エラーになります。

getの-neweronlyオプションを検証する

getの-latestと-neweronlyはうまく使うと対象のファイルを効率よく取得できそうです。

サーバ上にa.txtとb.txtを作成して状態を変えながら-neweronly付きでgetしてみます。
■初回DL
winscp> get * -neweronly C:\Users\hoge\Documents\winscp-newer\
b.txt                     |           19 B |    0.0 KB/s | binary | 100%
a.txt                     |           22 B |    0.0 KB/s | binary | 100%
⇒全てがダウンロードされる

■サーバ上のファイルに変更を加えずにgetする
winscp> get * -neweronly C:\Users\hoge\Documents\winscp-newer\
b.txt                     |            0 B |    0.0 KB/s | binary |   0%
a.txt                     |            0 B |    0.0 KB/s | binary |   0%
⇒変更されていないのでダウンロードサイズは0Bとなっており、ダウンロードされない

■a.txtに変更を加えてgetする
winscp> get * -neweronly C:\Users\hoge\Documents\winscp-newer\
b.txt                     |            0 B |    0.0 KB/s | binary |   0%
a.txt                     |           43 B |    0.0 KB/s | binary | 100%
⇒a.txtのみダウンロードされる

■b.txtに変更を加えてgetする
winscp> get * -neweronly C:\Users\hoge\Documents\winscp-newer\
a.txt                     |            0 B |    0.0 KB/s | binary |   0%
b.txt                     |           55 B |    0.0 KB/s | binary | 100%
⇒b.txtのみダウンロードされる

■サーバからa.txtを削除してgetする
winscp> get * -neweronly C:\Users\hoge\Documents\winscp-newer\
b.txt                     |            0 B |    0.0 KB/s | binary |   0%
⇒a.txtはダウンロードされないが、ローカルにダウンロードしたa.txtは残る
C:\Users\hoge>dir C:\Users\hoge\Documents\winscp-newer\
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は 3E8E-224B です

 C:\Users\hoge\Documents\winscp-newer のディレクトリ

2023/12/06  15:40    <DIR>          .
2023/12/06  15:40    <DIR>          ..
2023/12/06  15:43                43 a.txt
2023/12/06  15:44                55 b.txt
               2 個のファイル                  98 バイト
               2 個のディレクトリ  63,393,484,800 バイトの空き領域

■サーバ上に新たにa.txtを作る
winscp> get * -neweronly C:\Users\hoge\Documents\winscp-newer\
b.txt                     |            0 B |    0.0 KB/s | binary |   0%
a.txt                     |           55 B |    0.0 KB/s | binary | 100%
⇒新たにa.txtがダウンロードされ、ローカルのa.txtも更新される
C:\Users\hoge>dir C:\Users\hoge\Documents\winscp-newer\
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は 3E8E-224B です

 C:\Users\hoge\Documents\winscp-newer のディレクトリ

2023/12/06  15:40    <DIR>          .
2023/12/06  15:40    <DIR>          ..
2023/12/06  15:48                55 a.txt
2023/12/06  15:44                55 b.txt
               2 個のファイル                 110 バイト
               2 個のディレクトリ  63,391,109,120 バイトの空き領域

■ローカルのb.txtを削除してgetを実行する
winscp> get * -neweronly C:\Users\hoge\Documents\winscp-newer\
b.txt | 55 B | 0.0 KB/s | binary | 100%
a.txt | 0 B | 0.0 KB/s | binary | 0%
⇒b.txtがダウンロードされる 

C:\Users\hoge>dir C:\Users\hoge\Documents\winscp-newer\
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は 3E8E-224B です

 C:\Users\hoge\Documents\winscp-newer のディレクトリ

2023/12/06  17:34    <DIR>          .
2023/12/06  17:34    <DIR>          ..
2023/12/06  15:48                55 a.txt
2023/12/06  15:44                55 b.txt
               2 個のファイル                 110 バイト
               2 個のディレクトリ  63,173,144,576 バイトの空き領域

 

現在のセッションを表示

スクリプト起動時には使わないが、テストでステップで実行している時に他のセッションをcloseし忘れていないか確認する時など

session

1 hoge@server01

決め打ちのファイル名を取得

get filename c:\tmp\

昨日日付のタイムスタンプがファイル名についたファイルを取得

get *%TIMESTAMP-1D#yyyymmdd%* c:\tmp\

本日0900-1200台のタイムスタンプがファイル名についたファイルを取得

get *%TIMESTAMP#yyyymmdd%09* c:\tmp\
get *%TIMESTAMP#yyyymmdd%10* c:\tmp\
get *%TIMESTAMP#yyyymmdd%11* c:\tmp\
get *%TIMESTAMP#yyyymmdd%12* c:\tmp\

WinSCPスクリプト内の日付指定

YYYYMMDD
%TIMESTAMP#yyyymmdd%

YYYYMMDD-1
%TIMESTAMP-1D#yyyymmdd%

YYYYMM
%TIMESTAMP#yyyymm%

YYYYMMDDHH
%TIMESTAMP#yyyymmddhh%

例)ファイル名にタイムスタンプがある、実行日13時台のログファイルをすべて取得する
get hoge_%TIMESTAMP#yyyymmdd%13*.log C:\temp\

複数取得の場合はこうかな、まぁ2行にしてもよいけれど。
get hoge_%TIMESTAMP#yyyymmdd%13*.log hoge_%TIMESTAMP#yyyymmdd%14*.log C:\temp\

get command :: WinSCP


get -latestを使う

ディレクトリ配下に以下のようなファイルがあったとする
10月	23	13:36	aaa.txt
10月	23	13:35	aaa20231021.txt
10月	23	13:35	aaa20231022.txt
10月	23	13:34	aaa20231023.txt

get -latest aaa* C:\Users\hoge\work\

で取得されるファイルは条件にマッチするファイルの中で「タイムスタンプが最新のもの」となる
よってこの場合に取得されるファイルはaaa.txtとなる。

/parameter 引数を与えて実行し、引数に与えたwordを含むファイルをDLする

winscp /console /script="\path\to\script.txt" /parameter WORD1 WORD2 WORD3

get *%1%* \path\to\destfolder\
get *%2%* \path\to\destfolder\
get *%3%* \path\to\destfolder\

 

タイトルとURLをコピーしました