しょせんは、もどきです。

入門 5.関数/サブルーチン (2)関数(もどき)の呼び出し


コマンドプロンプト、バッチファイルを使わなきゃならなくなった人向けのメモ


バッチファイルの呼び出し方は、ここに書いた。
1つの処理で1つのバッチファイルを作成していくと、大量のファイルができてしまう。
バッチファイルの中で関数化したいが、バッチファイルには残念がなら
bashのようなfunction機能はない。。。


その代わり、CALL文とGOTO文を組み合わせた関数もどきを作ることができる。


GOTOのヘルプに以下の記載があるが、これだけだとなんのことか分からない。

GOTO コマンドにターゲット ラベルとして :EOF を指定し、現在のバッチ
スクリプト ファイルの最後に制御を移すことができるようになります。


バッチファイルの例として、JavaアプリケーションでClassNotFoundExceptionが
発生したと想定する。
どこに該当のjarがあるか分からないため、必要なclassをディレクトリおよび
サブディレクトリにあるjarから探すバッチを作成する。

  java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver
          at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
          at java.security.AccessController.doPrivileged(Native Method)
          at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
          at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
          at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
          at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
          at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
          at java.lang.Class.forName0(Native Method)
          at java.lang.Class.forName(Class.java:169)


まずは、バッチを見てもらう。

@echo off
set FIND_STR=%1
for /F "eol=; delims=," %%i in ('dir /s/b/a-d^|findstr jar$') DO CALL :GREP_CLASS="%%i"
GOTO :EOF

:GREP_CLASS
jar -tvf %1  |findstr %FIND_STR% 2>nul
IF {%ERRORLEVEL%}=={0} echo %1
GOTO :EOF


解説
:GREP_CLASSラベルを擬似関数とし、
for文での結果を渡して処理している
ラベルとGOTO :EOFの間を関数の処理として使うことができる。
(:EOFはファイルの最後に飛ぶため、:EOFのラベルを書く必要はない。)

パラメータも使用でき、%1、%2、・・・%10を使用することができる。
残念ながら復帰値は使えない。なので使用したい場合は、
SETLOCAL、ENDLOCALを組みあせて環境変数に設定するしかない。



結果

C:\usr\opt\oraclexe>grepclass oracle.jdbc.driver.OracleDriver
   731 Wed Jan 25 01:27:50 JST 2006 oracle/jdbc/driver/OracleDriver$1.class
 14943 Wed Jan 25 01:27:50 JST 2006 oracle/jdbc/driver/OracleDriver.class
  1004 Wed Jan 25 01:27:50 JST 2006 oracle/jdbc/driver/OracleDriverExtension.class
"C:\usr\opt\oraclexe\app\oracle\product\10.2.0\server\jdbc\lib\ojdbc14.jar"
   863 Wed Jan 25 01:42:02 JST 2006 oracle/jdbc/driver/OracleDriver$1.class
 19630 Wed Jan 25 01:42:02 JST 2006 oracle/jdbc/driver/OracleDriver.class
  1095 Wed Jan 25 01:42:02 JST 2006 oracle/jdbc/driver/OracleDriverExtension.class
"C:\usr\opt\oraclexe\app\oracle\product\10.2.0\server\jdbc\lib\ojdbc14_g.jar"