しょせんは、もどきです。
入門 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"