2015-02-25

バッチファイルで、ファイル名に含まれる文字列によって処理を分岐する

なかなかニッチな用途かもですが、覚書。


肝となるのがこの部分。

echo %~n1 | find "検索ワード" 1>nul
if not ERRORLEVEL 1 (
  goto process
)

"echo %~n1 | find "検索ワード" 1>nul" で、入力されたファイル名を表示したものを、パイプで find に渡し、検索をかけます。
"1>nul" は出力結果を出さないようにしているだけです。あってもなくても変わりません。

で、次の行の if 文内で、処理を行わせます。
ERRORLEVEL が 1 でない場合、検索ワードがファイル名 %~n1 に含まれている状態となっています。なので、そのとき if 文内で処理を行わせるという流れです。


例えば、「ドロップで処理するタイプのバッチファイル」で複数ファイルを処理するときに、ファイル名に含まれている文字列によってパラメータを変化させ、処理の引数に情報を反映することができたりします。

@echo off

:StartProcess
if "%~1" equ "" goto EndProcess

:: ファイル名に "Android" という文字列が含まれる場合
echo %~n1 | find "Android" 1>nul
if not ERRORLEVEL 1 (
  set STR=Android
  goto Process
)

:: ファイル名に "iOS" という文字列が含まれる場合
echo %~n1 | find "iOS" 1>nul
if not ERRORLEVEL 1 (
  set STR=iOS
  goto Process
)

:: ファイル名に "Windows Phone" という文字列が含まれる場合
echo %~n1 | find "Windows Phone" 1>nul
if not ERRORLEVEL 1 (
  set STR=Windows Phone
  goto Process
)

:Process
echo Target: %~1
echo String: %STR%

:NextProcess
shift
goto StartProcess

:EndProcess


上のコードの問題としては、似たような文字列を検索する場合 (包含関係が生まれる場合) に問題が発生します。
上から順に実行され、ヒットした場合には goto 文でジャンプするようにしてあるので、より上のヒットした条件の処理が適用されてしまいます。
また、goto 文をなくした場合には、一番最後にヒットしたところで処理が行われます。

ですので、使う用途によって、上手く改善する必要があります。

0 件のコメント :

コメントを投稿