7-Zipの話だが、以前は「空気読んで解凍」というコマンドがあったらしい。
動作は書庫に入っているのが1つの場合にはそのまま、複数だったら
フォルダを作成して解凍するというもの。
WinRARには解凍時に書庫名でフォルダを作成しそこに解凍する
スイッチ-adがあるが無条件作成なのでちょっと使いづらい。
「空気読んで解凍」モドキを実現するには
・-adをつけて解凍しフォルダが1つなら移動する
・解凍前に書庫のチェックして-adの有無を切り替える
の二つのアプローチがある。
最初前者の方法で実現しようとしたが、移動が思ったように
コントロールできず断念。
後者を行うにはWinRARには書庫内のエントリ数をカウントする機能がない。
使えそうなのはRARと7-Zip。
ただしどちらも万能ではなくて欠点がある。
・rar.exeはRAR書庫にしか使えない
・7-ZipはRAR5書庫に(対応予定はあるようだが未定)対応していない
あきらめて書庫に応じて切り替えることに。
ZIP/7z/LZH用 EntCnt7z.bat
@rem 7z、書庫の第一階層エントリ数取得 @rem 7z.exeの結果から\を含まない行数(直下のエントリ数)をカウント @rem 念のためダミーパスワード付与 @echo off SET PATH=C:\Program Files\7z938;%PATH% for /F "USEBACKQ" %%a in ( `7z l -pdummy %1 ^| findstr /r /c:" [.D][.R][.H][.S][.A] " ^| find /v /c "\"` ) do ( exit %%a )
RAR専用 EntCntRAR.bat
@rem RAR書庫のルート直下エントリ数をチェック @rem rar.exeの結果から\を含まない行数(直下のエントリ数)をカウント @rem 分割書庫はファイ名にpart*.rarを指定する @echo off SET PATH=%PATH%;C:\Program Files\WinRAR for /F "USEBACKQ" %%a in ( `Rar.exe lb -p- %1 ^| find /v /c "\"` ) do ( exit %%a )
呼び出し元
//直下エントリ数チェック RFile = iDir + iName[i] + '.' + iExt[i]; // カーソル位置ファイル名生成 command = '"' + PPx.Extract('%0%\\') + 'script\\EntCnt7z.bat"' + ' "' + RFile + '"'; RetCD = WSHObj.run(command,0,true); // 直下エントリ数判定 if (RetCD <= 1) { wRAROpt = ''; } else { wRAROpt = ' -ad'; }