Windowsのコマンドラインでバッチ処理を作るときに意外と困るのがファイルの圧縮・解凍で、Windows標準機能ではcabファイルしか取扱いできません。
WindowsXPやWindowsServer2003以降だとWindowsの標準機能でzipファイルの取扱いができるようになりましたが、それもエクスプローラ上などUIが必要でコマンドラインから圧縮・解凍可能なのはcabファイルだけです。
先日もサーバからダウンロードしたtar形式のファイルを解凍するバッチを作る事になったのですがWindowsの標準機能では解凍できません。
今回作成しようとしている、tarファイル解凍バッチはバッチ処理用サーバーOS上で動かす必要があり、安易にコマンドラインに対応している外部のアーカイバもインストールできません。
そこで試行錯誤した結果、吉岡 恒夫さんの作られたtar32.dllをWindows Script Host(WSH)で実行してtarファイルを解凍する方法をご紹介します。
まず今回作業するフォルダとして C:Worktar-test を作ります。
次に上記サイトのTAR32.DLL Ver2.xx(最新版) のDLL単体からtar32.dllをダウンロードして、C:Worktar-testフォルダに保存します。
次に適当に複数のファイルを圧縮したtar形式のファイルを準備してC:Worktar-testフォルダに保存します。
※圧縮するファイルは何でもいいです。
次にtar32.dllを実行してファイルを解凍するWSHを作ります。
C:Worktar-testフォルダにtar.jsというファイル名で保存します。
// WSH版tarコマンド
//
// 第一引数 オプション
// 第二引数 ファイル名
//
//
var objWshShell;
var objExecCmd;
if (funcParamCheck()) {
try {
objWshShell = WScript.CreateObject("WScript.Shell");
objExecCmd = objWshShell.Exec("rundll32.exe C:\Work\tar-test\tar32.dll, TarCommandLine " + WScript.Arguments(0) + " " + WScript.Arguments(1));
} catch(e) {
WScript.ECho("tarコマンド失敗!");
} finally {
objWshShell = null;
objExecCmd = null;
}
}
function funcParamCheck() {
if (WScript.Arguments.Unnamed.Length == 0) {
WScript.Echo("オプションの指定がありません。");
return false;
}
if (WScript.Arguments.Unnamed.Length == 1) {
WScript.Echo("ファイルの指定がありません。");
return false;
}
return true;
}
ポイントとしては[rundll32.exe]というdllを実行する実行ファイルを使ってtar32.dllを実行しtarファイルを解凍しています。
またコマンド実行時にパラメタとしてtarコマンドのオプションとファイル名を受け取りtarファイルの圧縮・解凍ができるようにしました。
ここまでの準備でC:Worktar-testフォルダにはtar.js、test.tar、tar32.dllの3つのファイルが格納されているかと思います。

さてtarファイルの解凍ですが、コマンドプロンプトから以下のように入力します。
cscript tar.js xzvf test.tar
またこの解凍したxmlファイルを別のtarファイルで再圧縮する場合は
cscript tar.js cvf "xml.tar *.xml"
この後tar.jsの第一パラメタに「tvf」を渡してファイルの一覧を表示しようと思ったのですが、一覧は返ってきませんでした。
原因はわからなかったのですが、恐らくrundll32.exe経由でtar32.dllを実行している為だと思われます。
正しく圧縮できたか任意のアーカイバでtarファイルの中を参照して確認してみてください。
今度はWindowsXPやWindowsServer2003以降のWindowsOSで標準搭載されているzipファイルの圧縮・解凍をWSHで実装してみたいと思います。
恐らく今回同様rundll32.exeを使ってできるのではないかと思いますが、それは次回のお楽しみということで。
でわ!


