Windows で Python や Ruby のスクリプトファイルにドラッグアンドドロップが出来る様にする方法

スポンサーリンク

 Windows 上では BAT ファイルや VBS でバッチ処理を行うことは当然可能であるが、VBS は馴染めないし BAT で何かするにもいちいち記述が面倒だし自由度も低いので嫌い。
 それならばと、Ruby や Python といった高級なスクリプト言語で同様なバッチ処理をやらせた方がマシだと思ったので個人用にあれこれとスクリプトを細々と書いている。
 ただ、Windows 標準では Python なら .py ファイル、Ruby なら .rb ファイルに対して引数として与えたいファイルをドラッグアンドドロップしても、スクリプトの起動は出来ない。レジストリでハンドラを与えて上げると可能になるので、これを紹介してみる。

Python のスクリプトの場合

 次の「Windows Registry」で始まる記述をまるっとコピってテキストエディタにペースト。拡張子を .reg にして保存した後にダブルクリックを行ってレジストリに追加すると、.py ファイルに対して他のファイルをドラッグアンドドロップしてスクリプトの起動が可能になる。つまり、引数にファイル名を与えて起動可能という事に。

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Python.File\shellex\DropHandler]
@="{60254CA5-953B-11CF-8C96-00AA00B8708C}"

Ruby のスクリプトの場合

 こも同様にして「Windows Registry」から始まり @ の行までコピーしてテキストエディタにペースト。拡張子を .reg にした上で保存し、保存したファイルをダブルクリックでレジストリにエントリを追加する。

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\RubyFile\ShellEx\DropHandler]
@="{60254CA5-953B-11CF-8C96-00AA00B8708C}"

個人的用途

 PT2 で録画した番組をエンコードする事が良くある。その際に TS ファイルを引数としてあたえることで、動画と音声を分離したり、動画部分をエンコードしつつ音声をトリミングして Mux した上で MP4 のコンテナに突っ込むだとか言う一連の動作をスクリプト化している。そういったスクリプトに対してこれから処理を行う TS ファイル名を与える目的でドラッグアンドドロップを多用している。

 具体例で言うなれば、TS ファイルを DGindex を用いた Demux を行う際、放送局毎に PIDs が変わるので、ファイル名に含まれる放送局を元に PIDs のパラメータを変えながら DGindex に引き渡すようなスクリプトが次の物。
 ついでに Demux された音声部分を疑似 WAVにも変換させている。
 同等の処理を BAT ファイルのみでやろうとすると吐きそうになるので、今後はもう Ruby か Python でいこうと思う。勉強するだとか言っておきながら殆どやってないのだが……

#! python
# -*- coding:utf-8 -*-

import sys
import glob
import subprocess
import re

# Program path.
DGINDEX = r"D:/TS/Utils/DGIndex/DGIndex.exe"
FAWCL = r"D:/TS/Utils/fawcl.exe"
DEST = r"D:/TS/temporary"

# Get argument.
arg_v = sys.argv
arg_c = len(arg_v) - 1

# Argument check.
if (arg_c < 1):
    print "Do not have an argument."
    sys.exit(1)

source = arg_v[1]

if re.search( r"\ (CX|EX|MX|NTV|TBS)\.ts$", source ):
    PIDs = "-ap 112 -vp 111 -pp 100"
elif re.search( r"\ TX\.ts$", source ):
    PIDs = "-ap 110 -vp 100 -pp 1ff"
elif re.search( r"\ BS11\.ts$", source ):
    PIDs = "-ap 141 -vp 140 -pp 111"
else:
    print "Can not detect PIDs"
    sys.exit(1)

print "** TS file split to .d2v and .aac"
cmd = "{DGINDEX} -i \"{source}\" -o {DEST}/demux {PIDs} -om 2 -minimize -exit".format(**locals())
subprocess.call(cmd, shell=True)

print "** Convert from AAC to PSEUDO WAV."
files = glob.glob( r"%s/demux*.aac" % DEST )
cmd = "{FAWCL} -s1 \"{files[0]}\" {DEST}/faw.wav".format(**locals())
subprocess.call(cmd, shell=True)

sys.exit(0)
スポンサーリンク