Windows環境にてswfmillを使って複数ファイルに同時に変換するコマンドプロンプト(バッチ)を書いたメモです。
swfmillというよりコマンドプロンプトで動くバッチを作った時に色々忘れててハマりまくったのでまとめておきます。
まず、swfmillとはなにか。
swfmillはSWFのバイナリの情報をXMLに変換(swf2xml)して、さらにそのXMLを(xml2swf)することでXMLをSWFに戻すことが出来るツールです。
- swfmill
SWFの内容がXMLになるということは、XMLからSWFに戻す前に、XML内の情報をルールに従って画像や変数(テキスト)を書き加えてしまえば、動的にSWFを帰ることが出来るツールです。対応OSもWindowsもMacもサーバーに入れられるのもあります。ですのでWEB上で動的に生成することも可能です。
とはいいつつ、この手法については既にメジャーなもので、今回のメモのポイントではないので、参考リンクを置きつつサラッと流します。
- swfmillでケータイFlashを動的生成してみよう(文字列置換編) | スマホサイト・アプリをつくろう。
- swfmillでケータイFlashを動的生成してみよう(インストール編) | スマホサイト・アプリをつくろう。
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内でファイルパスにまつわる色々な置換(ファイルパスのみとか、フルパスとか、拡張子だけとか)があるのは、うっすら知っていたのですが、全然思い出せず以下を参照。
・・・知りたかったのは「Variable substitution」の行なのですが、英語なので・・・分かるようなわからないような。
なので、日本語で触れてるサイトを探しました。
- バッチファイル – コマンドプロンプトの使用方法
- 「次のオプション構文を使うことができます」の付近で触れている。
- 「%I をドライブ文字とパスだけに展開します。」%~dpI、今回の用途に合った「%I をファイル名と拡張子だけに展開」する%~nxIという複合利用も記載されてありがたい。
- 「%」 – DOS コマンド一覧
- 「引数展開の拡張」で触れている。
これによって、FOR内でのファイルパスの利用がスムーズに行うことが出来て上記のコードに至りました。
おわりに
というわけで、変数の扱いがコマンドプロンプトとバッチで違うとか、FOR内でのファイルパスの置換という用途をどうやって検索しようか、などハマりまくり、作りたいイメージが見えているのに、完成に至るまで結構時間がかかりました。しかも、以前も何度か同じようなことでハマッてしまっただけに、今回こそは!とメモした次第です。ともあれ、出来てよかった。
それでは、よき Command Prompt Life を!