Python Windows上でbatファイルを複製し、順次実行する

本記事では、例としてLinuxからWindowsへフォルダ単位でファイルをダウンロードする方法をあげます。まず、WinSCPと呼ぶコンピュータ間でファイル転送を行うソフトウェアを使用するのでインストールします。これはオープンソースであり無料です。

本記事のPythonスクリプトは、Windows上で実行することでWinSCPスクリプト(.bat:バッチファイル)を複製して、Linux上の対象の複数ディレクトリをWindows上へコピーします。

WinSCPスクリプトは下記で、「WinSCP.bat」と保存して下さい。Linux上のダウンロードしたいフォルダ名は@MY_TARGET_DIR@、ダウンロードしたいフォルダがあるサーバー名(IP)は@MY_TARGET_SERVER@です。

ehcp 65001
echo off

set DIR_PATH=@MY_TARGET_DIR@

cd "C:Program Files\WinSCP\
for /d %%f in (%DIR_PATH%) do (
  (
    echo.option batch abort
    echo.option confirm off
    echo.get %%f @MY_DL_DIR@
    echo.close
    echo.exit
  ) | winscp.com /command "open @MY_TARGET_SERVER@"
)

そして、Pythonスクリプトは下記で、「WinSCPscript_CREATE_and_RUN.py」とでも保存して下さい。上記.batファイル内の@マークで囲まれた箇所を置換しderive_WinSCP_*.batという名のバッチファイルを複製してから、順次実行してゆく仕組みです。

特記事項としては、引数を3つ持っており下記のようにして実行します。

python WinSCPscript_CREATE_and_RUN.py [pass] [start_num] [end_num]

[pass]はLinuxへのログインパス、[start_num] [end_num]は対象とするディレクトリ名の開始番号と終了番号です(本記事では例として対象ディレクトリ名が番号であるとしているため)。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import sys
import subprocess

def create_bat(original_bat, targetSERVER, targetDIR, DL_DIR, i):
    with open(DL_DIR + original_bat, "r") as f1:
        with open(DL_DIR + original_bat + "_" + str(i) + ".bat", "w") as f2:
            for row in f1:
                buf = row.replace("MY_TARGET_SERVER", targetSERVER) \
                         .replace("MY_TARGET_DIR", targetDIR) \
                         .replace("MY_DL_DIR", DL_DIR)
                f2.write(buf)

def run_bat(num_ST, num_E):
    for i in range(int(num_S), int(num_E) + 1):
        subprocess.call(["derive_" + original_bat + "_" + str(i) + ".bat"])

if __name__ == '__main__':
    if (len(sys.argv) != 4):
        print("Arg mismatch")
        print("Usage: python WinSCPscript_CREATE_and_RUN.py [pass] [start_num] [end_num]")
        sys.exit("input 4 Argments")

    original_bat = "WinSCP.bat"
    userID = "hk29"
    userPASS = sys.argv[1]
    SERVER_ADDRESS = 'xxxx'
    
    targetSERVER = userID + ':' + userPASS + '@' + SERVER_ADDRESS
    DL_DIR = "C:\\Users\\hk29\\Desktop\\test\\"
    num_S = sys.argv[2]
    num_E = sys.argv[3]

    for i in range(int(num_S), int(num_E) + 1):
        targetDIR = '/home/xxx/downloadtargetdir_' + str("{0:03d}".format(i))
        create_bat(original_bat, targetSERVER, targetDIR, DL_DIR, i)
    run_bat(num_S, num_E)
    print('finished')
    

以上

<広告>