昔の7-Zipには有ったと噂される「空気読んで解凍」
PPxのスクリプトにはまっていた時期にそれっぽいのを
作成していたのだが、たまに判定に失敗することがあった
https://nakapon.hatenablog.com/entry/20150627/1435405743
#そう言えばこの頃はまだ7-ZipがRAR5に対応してなかったんだな
さほど致命的な判定ミスでもないのでそのまま使っていたのだが、
先日WSLを使用開始しWindows<->WSL間での処理連携でやたらと
バッチやスクリプトを組むことになったので、頭の体操で
見直してみることに
#余談だが、テキスト処理はコマンドの豊富なlinux(unix)系が便利だと再確認
PPxに依存していた部分をすべて書き直し
D&Dで渡された一連の書庫ファイルを順次処理
書庫判定をしてないので書庫以外はWinRARでエラーが出る
バッチだから読みづらいが、処理は大したことをしていない
1.%%iで1ファイルずつ取り出して処理
2.デリミタに\ を指定し6番目のトークン(ディレクトリorファイル名)を取出
3.二つ以上名前があるかの判定なのでソート不要
4.二つ目が見つかったらループ強制終了(GOTO)<-このVerではオミット
5.CMDにADと書庫名を連結して実行
注意点としてfor中でGOTOするとループ処理が中断されてしまう
コメントアウトで逃げているが、書庫名ループとファイル名ループを
分離し二つに分ければできるのではないかと思う
ただ判定処理を中断することによる処理時間の微々たる短縮より
1ファイルにまとまっている方が便利だと個人的には思う
<追記>
cabは位置がずれるため判定しトークンを変更するようにした
@ECHO OFF setlocal enabledelayedexpansion SET PATH=C:\Program Files\7z;%PATH% FOR %%i IN (%*) DO ( SET FILE=%%i SET OLD= SET AD= SET CNT= if not %~x1 == .cab ( SET TNO=6 ) else ( SET TNO=5 ) FOR /F "USEBACKQ tokens=%TNO% delims=\ " %%a IN ( `7z ^l -pdummy %%i ^| findstr /r /c:" [.D][.R][.H][.S][.A] "` ) DO ( IF NOT %%a == !OLD! ( SET OLD=%%a SET /a CNT=CNT+1 IF !CNT! geq 2 ( SET AD=-ad REM GOTO :PACK for中でGOTOすると処理が中断してしまう ) ) ) :PACK SET CMD="C:\Program Files\WinRAR\WinRAR.exe" x !AD! !FILE! CALL !CMD! )