*[WinRAR]「空気読んで解凍」モドキ ver.2

昔の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!
)