Windows環境にてswfmillを使って複数ファイルに同時に変換するコマンドプロンプト(バッチ)を作ったメモ

Windows環境にてswfmillを使って複数ファイルに同時に変換するコマンドプロンプト(バッチ)を書いたメモです。

swfmillというよりコマンドプロンプトで動くバッチを作った時に色々忘れててハマりまくったのでまとめておきます。

まず、swfmillとはなにか。

swfmillはSWFのバイナリの情報をXMLに変換(swf2xml)して、さらにそのXMLを(xml2swf)することでXMLをSWFに戻すことが出来るツールです。

SWFの内容がXMLになるということは、XMLからSWFに戻す前に、XML内の情報をルールに従って画像や変数(テキスト)を書き加えてしまえば、動的にSWFを帰ることが出来るツールです。対応OSもWindowsもMacもサーバーに入れられるのもあります。ですのでWEB上で動的に生成することも可能です。

とはいいつつ、この手法については既にメジャーなもので、今回のメモのポイントではないので、参考リンクを置きつつサラッと流します。

Windowsでswfmillを行う

今回は何をしたかというと、swfmillの細かな変換の挙動を検証するべく、Windows環境でコマンドプロンプトを使う形で作業をしていたのです。

まず、変換し・・・。

swfmill swf2xml test.swf test.swf.xml

すぐに戻す。

swfmill xml2swf test.swf.xml test.swf_convert.swf

こういうことですね。

繰り返し変換していると疲れてくる

そう、上記の処理。一回test.swf試すだけならいいのです。しかし、検証していると色々なファイルを試します。繰り返し変換していると疲れてくる。

当然のことながら、あるフォルダに入れているSWFを一気に変換したいという衝動に駆られます。

今回はこうしました。

  • swfmillをPATH設定で通すのは大変なのでswfmill.exe直下で機能させたい
  • baseというフォルダに入れてあるswfをxmlに変換し、変換後のSWFはconvertフォルダに変換する。
    • 変換したXMLは<元SWFのファイル名(拡張子を抜いたもの)>.xmlとする。
    • 変換後のSWFは<元SWFのファイル名(拡張子を抜いたもの)>_convert.swfとする。
  • バッチファイルとして動作させたい。

出来上がったバッチファイルはこちら

ひとまず紆余曲折の末出来上がったバッチファイルはこちら。

@echo off

@echo 開始します。
@echo %CD%

: FOR構文
for %%i IN (base\*.swf) DO (
@echo %%i を変換しました。
: 元SWFをXMLに変換します。
swfmill swf2xml %%~fi %%~dpni.xml
: XMLを再度SWFに変換します。
swfmill xml2swf %%~dpni.xml %%~dpi\..\convert\%%~nxi_convert.swf
)

pause

こんなメッセージが出ます。

開始します。
c:\swfmill-0.3.2-win32
base\test.swf を変換しました。
続行するには何かキーを押してください . . .

ハマりポイントを書いておく

上記に至るまでにいろいろハマりポイントがあったので書いておきます。

FORの書き方は以下を参考。

まず、FORの書き方は以下を参考しました。

Dos、バッチ、コマンドプロンプトで仕事をしなければいけない不幸な人に送るforコマンド解説 | WindowsServer管理者への道

for %i IN (base\*.swf) DO (

こう書いたけどコマンドプロンプトでは動いてバッチにすると動かない・・・。なぜだ・・・。

変数の扱いがコマンドプロンプトとバッチで違う

そして、以下のサイトを見つけて、

コマンドプロンプトを使ってみよう! -バッチファイル-

■ バッチファイル内 ■
for %%変数名 in (セット) do コマンド名 [コマンドパラメータ]

■ コマンドラインで ■
for %変数名 in (セット) do コマンド名 [コマンドパラメータ]

という大変丁寧な説明を見つけることで、ようやくFOR構文を動作することに成功。

for %%i IN (base\*.swf) DO (

変数の扱いがコマンドプロンプトとバッチで違うようです。。。

FOR内で使える変数参照の置換もハマる

以前から、FOR内でファイルパスにまつわる色々な置換(ファイルパスのみとか、フルパスとか、拡張子だけとか)があるのは、うっすら知っていたのですが、全然思い出せず以下を参照。

Microsoft Windows XP – For

・・・知りたかったのは「Variable substitution」の行なのですが、英語なので・・・分かるようなわからないような。

なので、日本語で触れてるサイトを探しました。

これによって、FOR内でのファイルパスの利用がスムーズに行うことが出来て上記のコードに至りました。

おわりに

というわけで、変数の扱いがコマンドプロンプトとバッチで違うとか、FOR内でのファイルパスの置換という用途をどうやって検索しようか、などハマりまくり、作りたいイメージが見えているのに、完成に至るまで結構時間がかかりました。しかも、以前も何度か同じようなことでハマッてしまっただけに、今回こそは!とメモした次第です。ともあれ、出来てよかった。

それでは、よき Command Prompt Life を!